ZOJ 1082 Stockbroker Grapevine (dijkstra方法)

以每个点si作为顶点,开始找最短路径,找到所有到si的最短路径的最大值找出来,是vi,找出所有si对应的vi的最小值。

 

#include<iostream> #include<algorithm> #include<climits> using namespace std; const int INF=78787878;//我用INT_MAX的时候错的非常惨烈。。 int mat[101][101]; int flag[101]; int dist[101]; int cases; void dijkstra(int start)//从start开始搜寻 { fill(flag,flag+101,0); fill(dist,dist+101,INF); int now = start; int i,k,j=cases; int min; dist[start]=0; flag[start]=1; while(--j) { for(i=1;i<=cases;i++) if(flag[i] == 0 && dist[i] > dist[now] + mat[now][i]) dist[i] = dist[now] + mat[now][i]; for(i=1,min = INF;i<=cases;i++) if(dist[i] < min && flag[i] == 0) {now=i;min = dist[i];} flag[now]=1; } } int main() { int n,i,j,k,from,to,ttime; int min,max,all,allall; while( cin >> cases && cases ) { for(i = 1;i<=cases;i++) for(j=1;j<=cases;j++) mat[i][j] = INF; for(i = 1;i<=cases;i++) { cin >> n; while(n--) { cin >> to ; cin >> mat[i][to]; } } for(i=1,min=INF,max=INF,allall=0;i<=cases;i++) { dijkstra(i); for(j=1,all=1;j<=cases;j++) if(flag[j]==0) all=0; if(all) { allall=1; for(j=1,max=0;j<=cases;j++) { if(dist[j] > max) max = dist[j]; } } if(max < min) {k=i;min = max;} } if(!allall) cout << "disjoint/n"; else cout <<k<<' '<<min <<endl; } return 0; }

你可能感兴趣的:(ZOJ 1082 Stockbroker Grapevine (dijkstra方法))