hdu 4460 第37届ACM/ICPC杭州赛区H题 STL+bfs
题意:一些小伙伴之间有朋友关系,比如a和b是朋友,b和c是朋友,a和c不是朋友,则a和c之间存在朋友链,且大小为2,给出一些关系,求出这些关系中最大的链是多少?
求最短路的最大距离
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 #define cl(a) memset(a,0,sizeof(a)) 13 #define ts printf("*****\n"); 14 const int MAXN=1005; 15 int n,m,tt,dis[MAXN][MAXN]; 16 map<string,int> mp; 17 vector<int> vc[MAXN]; 18 void bfs(int u) 19 { 20 queue<int> q; 21 bool vis[MAXN]; 22 dis[u][u]=0; 23 cl(vis); 24 int now,next; 25 q.push(u); 26 vis[u]=1; 27 while(!q.empty()) 28 { 29 now=q.front(); 30 q.pop(); 31 int num=vc[now].size(); 32 for(int j=0;j<num;j++) 33 { 34 next=vc[now][j]; 35 if(vis[next]) continue; 36 dis[u][next]=dis[u][now]+1; 37 q.push(next); 38 vis[next]=1; 39 } 40 } 41 } 42 int main() 43 { 44 int i,j,k; 45 #ifndef ONLINE_JUDGE 46 freopen("1.in","r",stdin); 47 #endif 48 while(scanf("%d",&n)!=EOF) 49 { 50 string s1,s2; 51 cl(dis); 52 if(n==0) break; 53 for(i=0;i<n;i++) 54 { 55 cin>>s1; 56 mp[s1]=i; 57 } 58 for(int i=0;i<n;i++) 59 { 60 dis[i][i]=0; 61 for(int j=i+1;j<n;j++) 62 dis[i][j]=dis[j][i]=INF; 63 } 64 scanf("%d",&m); 65 for(i=0;i<n;i++) vc[i].clear(); 66 while(m--) 67 { 68 cin>>s1>>s2; 69 int t1=mp[s1]; 70 int t2=mp[s2]; 71 vc[t1].push_back(t2); 72 vc[t2].push_back(t1); 73 } 74 for(i=0;i<n;i++) bfs(i); 75 int ans=0; 76 for(i=0;i<n;i++) 77 for(j=i+1;j<n;j++) 78 { 79 ans=max(ans,dis[i][j]); 80 } 81 if(ans==INF)ans=-1; 82 printf("%d\n",ans); 83 } 84 }