Problem:Friend Chains
Description:有n个人,m个关系,A认识B经过最少的人数为A到B的关系长度,问在这n个人中,任意两个人相互认识的最长关系长度为多少。如果有两个人无法通过关系认识则输出-1。
Solution:很明显的最短路问题。但是用floyd肯定超时,dijkstra算法这题也会超时。用spfa最后卡在了STL的队列上,换成手写的队列之后差不多卡着时间过了。
Code(C++):
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <map>
#define N 1100
#define inf 0x3f3f3f3f
using namespace std;
string str;
string str1,str2;
int visit[N],n,t;
int dis[N],ans;
int head[N];
map<string,int>mp;
struct edge
{
int u;
int v;
int cost;
int next;
} e[N*N];
void addedge(int u,int v,int c)
{
e[t].u=u;
e[t].v=v;
e[t].cost=c;
e[t].next=head[u];
head[u]=t++;
}
const int M=(int)1e8;
int q[M],top,tail;
void Spfa(int src)
{
int u,v,weight;
memset(visit,0,sizeof(visit));
memset(dis,inf,sizeof(dis));
dis[src]=0;
top=tail=0;
q[tail++]=src;
tail%=M;
visit[src]=1;
while(top!=tail)
{
u=q[top++];
top%=M;
visit[u]=0;
for(int i=head[u]; i!=-1; i=e[i].next)
{
v=e[i].v;
weight=e[i].cost;
if(dis[v]>dis[u]+weight)
{
dis[v]=dis[u]+weight;
if(!visit[v])
{
q[tail++]=v;
tail%=M;
visit[v]=1;
}
}
}
}
}
int main()
{
int m;
while(scanf("%d",&n),n)
{
t=0;
ans=-inf;
memset(head,-1,sizeof(head));
mp.clear();
for(int i=0; i<n; i++)
{
cin>>str;
mp[str]=i;
}
scanf("%d",&m);
for(int i=0; i<m; i++)
{
cin>>str1>>str2;
addedge(mp[str1],mp[str2],1);
addedge(mp[str2],mp[str1],1);
}
for(int i=0; i<n; i++)
{
Spfa(i);
for(int j=0; j<n; j++)
{
if(j==i)
continue;
else if(dis[j]>ans)
ans=dis[j];
}
}
if(ans!=inf)
cout<<ans<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}