HDU 4460 Friend Chains -多源最短路裸题

题意:

求任意两点间最短路,输出其中最大的值

思路:

n次DJI,n次spfa。。。。

数据的问题吧。。。DJI交是TLE..

spfa才用了500ms....

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <vector> 
using namespace std;
 const int inf=2147483647;
vector<int> tm[1005];
map <string,int> uu;
char tmp_char[15];
char tmp_char2[15];
int vis[1005];
int dis[1005][1005];
    int n,m;
int main()
{
    void spfa(int );

    int i,j;
while(    scanf("%d",&n)!=EOF)
{
    if (!n) break;
    string ss;
    uu.clear();
     
    for (i=1;i<=n;i++)
    {
        scanf("%s",tmp_char);
        ss=tmp_char;
        uu.insert(make_pair(ss,i));
    }
    scanf("%d",&m);
    for (i=1;i<=m;i++)
    {
        scanf("%s %s",tmp_char,tmp_char2);
        ss=tmp_char;
        int x=uu[tmp_char];
        ss=tmp_char2;
        int y=uu[tmp_char2];
        tm[x].push_back(y);
        tm[y].push_back(x);
    }

    for (i=1;i<=n;i++)
    {
        spfa(i);
    }

    int maxx=0;
    for (i=1;i<=n;i++)
    {

        for (j=1;j<=n;j++)
        {
        if (dis[i][j]>maxx)
        maxx=dis[i][j];
        }
    }
    printf("%d\n",maxx==inf?-1:maxx);
    for (i=1;i<=n;i++)
    tm[i].clear();

}
    return 0;
    
}

queue<int> q;
void spfa(int start)
{
    int st=start;
    while(!q.empty()) q.pop();
    int i;
    for (i=1;i<=n;i++)
    {
        dis[st][i]=inf;
        vis[i]=0;
    }
    dis[st][st]=0;
    vis[st]=1;
    q.push(st);
    while(!q.empty())
    {
        int tt=q.front();
        q.pop();
        for (i=0;i<tm[tt].size();i++)
        {
        //    if (tm[tt][i]==0) continue;//道路不连通
            int yy=tm[tt][i];
            if (dis[st][tt]+1<dis[st][yy])
            {
                dis[st][yy]=dis[st][tt]+1;
                if (!vis[yy])
                {
                    q.push(yy);
                    vis[yy]=1;
                }
            }
        }
        vis[tt]=0;
    }
    
}


你可能感兴趣的:(HDU 4460 Friend Chains -多源最短路裸题)