hud 4460
多源最短路---交朋友
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<stack> #include<cstdio> #include<queue> #include<map> #include<vector> #include<set> using namespace std; const int maxn=1010; const int INF=0x3fffffff; typedef long long LL; //多源最短路问题 //SPFA+暴力 //求两点最大距离 struct node{ int to,dis,from; int next; }ed[151511]; int head[10010]; int dis[10010]; int vis[10010]; int cnt=0; int n,m; void add(int from,int to,int dis){ ed[cnt].to=to; ed[cnt].dis=dis; ed[cnt].next=head[from]; head[from]=cnt++; } int spfa(int s){ queue<int> q; q.push(s); for(int i=1;i<=n;i++) dis[i]=0x3f3f3f3f; dis[s]=0; memset(vis,0,sizeof(vis)); vis[s]=1; while(!q.empty()){ int t=q.front(); q.pop(); vis[t]=0; for(int i=head[t];~i;i=ed[i].next){ int v=ed[i].to; if(dis[v]>dis[t]+ed[i].dis){ dis[v]=dis[t]+ed[i].dis; if(vis[v]==0){ vis[v]=1; q.push(v); } } } } //直接在这判断最远 int mi=0; for(int i=1;i<=n;i++){ if(dis[i]>mi) mi=dis[i]; } if(mi==0x3f3f3f3f) return -1; else return mi; } int main(){ while(~scanf("%d",&n)){ char ss[1000]; if(n==0) break; map<string,int> aa; int tot=0; for(int i=0;i<n;i++){ scanf("%s",ss); ///!!! if(aa[ss]==0){ aa[ss]=++tot; //避免重复 } } scanf("%d",&m); tot=0; memset(head,-1,sizeof(head)); for(int i=0;i<m;i++){ scanf("%s",ss); int u=aa[ss]; scanf("%s",ss); int v=aa[ss]; add(u,v,1); add(v,u,1); } //做n次spfa bool isok=0; int maxx=-INF,temp; for(int i=1;i<=n;i++){ temp=spfa(i); if(temp==-1) { isok=1; break; } else maxx=max(maxx,temp); } if(isok) printf("-1\n"); else printf("%d\n",maxx); } return 0; }
原文:https://www.cnblogs.com/shirlybaby/p/12390921.html