HDU-#4460 Friend Chains(bfs)

来源:互联网 发布:c语言联合体初始化为0 编辑:程序博客网 时间:2024/04/29 15:47

         题目大意:给出n个人以及m种朋友关系,求一个系数k,使得任意两人的关系长度不会超过k。

        解题思路:最容易想到的是Floyd算法,求出每两人之间的的距离,然后更新最长关系值。但在这样O(N^3)会超时,这里可以用bfs去跑出所有点的距离,然后再判断。也可利用SPFA算法进行求解,这与bfs的写法相差不大。不过还有大神用了字典树来写,实在是高呀。这里给出bfs的code。

        题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4460

        bfs code:

#include <iostream>#include <cstdio>#include <cstring>#include <map>#include <queue>#include <vector>#include <algorithm>using namespace std;const int MAXN = 1000+10;const int inf = 0x3fffffff;int ans,n,m;char str[15],str1[15],str2[15];int vis[MAXN],dist[MAXN][MAXN];map<string,int> h;vector<int> g[MAXN];queue<int> q;void bfs(int x){    memset(vis,0,sizeof(vis));    dist[x][x]=0;    vis[x]=1;    q.push(x);    while(!q.empty()){        int t=q.front();q.pop();        int len=g[t].size();        for(int i=0;i<len;++i){            int v=g[t][i];            if(vis[v]) continue;            dist[x][v]=dist[x][t]+1;            q.push(v);            vis[v]=1;        }    }}int main(){    //freopen("input.txt","r",stdin);    while(~scanf("%d",&n) && n){        getchar();        h.clear();        for(int i=0;i<n;++i) g[i].clear();        for(int i=0;i<n;++i){            dist[i][i]=0;            for(int j=i+1;j<n;++j)                dist[i][j]=dist[j][i]=inf;        }        for(int i=0;i<n;++i){            scanf("%s",str);            h[str]=i;        }        scanf("%d",&m);        getchar();        for(int i=0;i<m;++i){            scanf("%s %s",str1,str2);            g[h[str1]].push_back(h[str2]);            g[h[str2]].push_back(h[str1]);        }        for(int i=0;i<n;++i) bfs(i);        ans=0;        for(int i=0;i<n;++i)            for(int j=i+1;j<n;++j)                ans=max(ans,dist[i][j]);        if(ans==inf)  printf("-1\n");        else printf("%d\n",ans);    }    return 0;}


0 0