PKU1125-Stockbroker Grapevine
解法
ダイクストラ法.結局全点間最短距離に帰着されるのでワーシャルフロイド法の方が賢い.
実装(C++)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; int N; int G[100][100]; int mintime[100]; int solve(int s){ fill(mintime,mintime+N,9999999); mintime[s]=0; typedef pair<int,int> P; priority_queue<P,vector<P>,greater<P> > que; que.push(P(0,s)); while(!que.empty()){ P t=que.top();que.pop(); if(mintime[t.second]<t.first)continue; for(int i=0;i<N;i++){ if(G[t.second][i]>0){ int nt=G[t.second][i]+t.first; if(mintime[i]>nt){ mintime[i]=nt; que.push(P(nt,i)); } } } } return *max_element(mintime,mintime+N); } int main() { while(scanf("%d",&N),N){ memset(G,0,sizeof(G)); for(int i=0;i<N;i++){ int k; scanf("%d",&k); for(int j=0;j<k;j++){ int a,b; scanf("%d%d",&a,&b);a--; if(G[i][a]==0)G[i][a]=b;else G[i][a]=min(G[i][a],b); } } int ans_start=-1,answer=9999999; for(int i=0;i<N;i++){ int t=solve(i); if(t<answer){ answer=t; ans_start=i; } } if(answer>999999){ puts("disjoint"); }else{ printf("%d %d\n",ans_start+1,answer); } fflush(stdout); } return 0; }