最短路之——尋找每兩點之間最短路中的最長路
阿新 • • 發佈:2019-01-30
題目:hdu4460
題意:尋找每兩點之間最短路中的最長路。若存在某兩點不連通,就輸出-1.
解答:對每個點spfa,然後找最長的邊。用鄰接連結串列存~~注意:雙向邊!
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> using namespace std; const int MAXN = 10010 + 10010; const int INF = 1 << 30; int w[MAXN],u[MAXN],v[MAXN]; int first[1100],Next[MAXN],dis[1100]; int book[1100]; int ans; int n,m; queue<int> q; int spfa(int a) { int Max = 0; while(!q.empty()) q.pop(); // for(int i = 0;i < n;i++) // first[i] = -1; for(int i = 0;i < n;i++) book[i] = 0; for(int i = 0;i < n;i++) dis[i] = INF; dis[a] = 0; q.push(a); book[a] = 1; while(!q.empty()) { int k = first[q.front()]; while(k!=-1) { if(dis[v[k]] > dis[u[k]] + w[k]) { dis[v[k]] = dis[u[k]] + w[k]; if(book[v[k]] == 0) { q.push(v[k]); book[v[k]] = 1; } } k = Next[k]; } book[q.front()] = 0; q.pop(); } return 0; } int main() { map<string,int> M; char tmp[12],tmp1[12],tmp2[12]; while(scanf("%d",&n)) { if(n == 0) break; int tot = 0; for(int i = 0;i < n;i++) { scanf("%s",tmp); M[tmp] = tot++; } for(int i = 0;i < n;i++) first[i] = -1; scanf("%d",&m); for(int i = 0;i < 2*m;i+=2) { scanf("%s%s",tmp1,tmp2); u[i] = M[tmp1]; v[i] = M[tmp2]; Next[i] = first[u[i]]; first[u[i]] = i; w[i] = 1; u[i+1] = M[tmp2]; v[i+1] = M[tmp1]; Next[i+1] = first[u[i+1]]; first[u[i+1]] = i+1; w[i+1] = 1; } m = m * 2; int result = 0; for(int i = 0;i < n;i++) { spfa(i); int ok = 1; for(int j = 0;j < n;j++) { if(dis[j] == INF) { int ok = 0; result = -1; break; } result = max(result,dis[j]); } if(ok == 0) break; } printf("%d\n",result); } return 0; }