首页 > 代码库 > hdu-4460 Friend Chains

hdu-4460 Friend Chains

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

求任意点对的最短距离的最大值,因为题目数据量大,用floyed 和dijkstra都不行,这里用spfa实现

#include<cstdio>
#include<map>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#define N 1001
#define inf 0x7fffffff
using namespace std;
int dis[N][N],n,vis[N];
vector<int>v[N];
queue<int>q;
map<string,int>mm;
void init()
{
    for(int i=0;i<n;i++)
        v[i].clear();
    for(int i=0;i<n;i++)
    {
        dis[i][i]=0;
        for(int j=i+1;j<n;j++)
          dis[i][j]=dis[j][i]=inf;
    }
    mm.clear();
    while(!q.empty()) q.pop();
}
void spfa(int i)
{
    vis[i]=1;
    dis[i][i]=0;
    q.push(i);
    while(!q.empty())
    {
        int t=q.front();
        q.pop();
        for(int j=0;j<v[t].size();j++)
        {
            int m=v[t][j];
            if(!vis[m])
            {
                dis[i][m]=dis[i][t]+1;
                vis[m]=1;
                q.push(m);
            }
        }
    }
}
int main()
{
    int m;
    string s,a,b;
    while(scanf("%d",&n)!=EOF&&n)
    {
        init();
        for(int i=0;i<n;i++)
        {
            cin>>s;
            mm[s]=i;
        }
        scanf("%d",&m);
        while(m--)
        {
            cin>>a>>b;
            int x=mm[a];
            int y=mm[b];
            v[x].push_back(y);
            v[y].push_back(x);
        }
        for(int i=0;i<n;i++)
        {
            memset(vis,0,sizeof(vis));
            spfa(i);
        }
        int ans=0;
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {

                ans=max(ans,dis[i][j]);
            }
        }
        if(ans==inf) printf("-1\n");
        else printf("%d\n",ans);
    }
    return 0;
}


 

hdu-4460 Friend Chains