首页 > 代码库 > hdu-4460 Friend Chains
hdu-4460 Friend Chains
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; }
hdu-4460 Friend Chains
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。