• 【BFS】hdu 4460 Friend Chains


    题目描述:

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

     

    中文大意:

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

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

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

     

    思路:

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

    注意:在处理完用户输入的一组数据后,要及时清空或者及时声明新的存储空间,例如 memset(...)。

     

    代码:

    #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
    ");
            } 
            else{
                printf("%d
    ", k);
            }
        }
    }
    作者:老干妈就泡面
    本文版权归作者和博客园共有,欢迎转载,但请给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    day7
    11.3NOIP模拟赛
    codeforces 880E. Maximum Subsequence(折半搜索+双指针)
    11.2NOIP模拟赛
    bzoj1483: [HNOI2009]梦幻布丁(vector+启发式合并)
    day9
    codeforces 1006 F(折半搜索)
    codeforces 28D(dp)
    P2210 Haywire(A*)
    4800: [Ceoi2015]Ice Hockey World Championship(折半搜索)
  • 原文地址:https://www.cnblogs.com/bjxqmy/p/14350863.html
Copyright © 2020-2023  润新知