其他分享
首页 > 其他分享> > 【BFS】hdu 4460 Friend Chains

【BFS】hdu 4460 Friend Chains

作者:互联网

题目描述:

http://acm.hdu.edu.cn/showproblem.php?pid=4460

 

中文大意:

人与人之间存在着关系网,例如 A 认识 B,B 认识 C,那么 A 就可以通过 B 联系到 C。

根据关系网,我们可以计算出两个人之间的最短联系距离。

要求:找出最短联系距离中的最大值 k,如果一群人中存在着不能相互联系的两个人,则输出“-1”。

 

思路:

分别以每个人为起点进行广搜,计算出这个人与其他人的最短联系距离。k 为其中的最大值。

注意:在处理完用户输入的一组数据后,要及时清空或者及时声明新的存储空间,例如 vector<int> g。

 

代码:

#include<bits/stdc++.h>
using namespace std;

int n, k, flag;

vector<int> g[1000];

void bfs(int index){
    //存在不能相互联系的人
    if(flag == 1){
        return;
    }
    
    bool* visited = new bool[n]();
    visited[index] = true;
    int result = 0;
    
    queue<int> q;
    q.push(index);
    q.push(0);
    
    //关系网上朋友的数量 
    int num = 1;
    while(!q.empty()){
        index = q.front();
        q.pop();
        int dis = q.front();
        q.pop();
        
        result = max(dis, result);
        
        for(int i=0;i<g[index].size();i++){
            int next = g[index][i];
            if(!visited[next]){
                visited[next] = true;
                q.push(next);
                q.push(dis + 1);
                num++;
            }
        }
    }
    if(num != n){
        flag = 1;
    }
    else{
        k = max(k, result);
    }
}

int main(){
    while(scanf("%d", &n) && n){
        memset(g,0,sizeof(g));
        
        map<string, int> mp;
        string str1,str2;
        
        for(int i=0;i<n;i++){
            cin>>str1;
            mp[str1] = i;
        }
        
        int m;
        scanf("%d", &m);
        
        for(int i=0;i<m;i++){
            cin>>str1>>str2;
            g[mp[str1]].push_back(mp[str2]);
            g[mp[str2]].push_back(mp[str1]);
        }
        
        k = 0;
        flag = 0;
        for(int i=0;i<n;i++){
            bfs(i);
        }
        
        if(flag){
            printf("-1\n");
        } 
        else{
            printf("%d\n", k);
        }
    }
}

 

标签:index,hdu,int,str2,str1,BFS,mp,push,Chains
来源: https://www.cnblogs.com/bjxqmy/p/14350863.html