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; }
时间: 2024-11-10 00:59:20