题意:
求任意两点间最短路,输出其中最大的值
思路:
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;
}
}