zoukankan      html  css  js  c++  java
  • 【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);
            }
        }
    }
    作者:老干妈就泡面
    本文版权归作者和博客园共有,欢迎转载,但请给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    蛇形填数
    开灯问题
    水仙花数
    C++Primer笔记-----day02
    C++Primer笔记-----day01
    面试智力题
    maven 打包197
    子系统 安装vsftpd197
    office 安装破解197
    oracle 创建多个数据库197
  • 原文地址:https://www.cnblogs.com/bjxqmy/p/14350863.html
Copyright © 2011-2022 走看看