优先队列的dijkstra,直接暴力枚举每一个点。
直接套了自己的模板干的。
12955042 | 201301052100 | 1125 | Accepted | 672K | 0MS | G++ | 1858B | 2014-06-07 11:21:16 |
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
using namespace std;
#define MAXD 100 + 10
#define Inf 1 << 30
#define max(a,b) (a > b ? a : b)
#define min(a,b) (a < b ? a : b)
typedef pair<int,int> pill;
struct Line{
int l;
int cost;
};
int n;
vector<Line>G[MAXD];
int dist[MAXD];
int solve(int start){
int ans = 0;
priority_queue<pill,vector<pill>,greater<pill> >q;
for(int i = 1; i <= n ; i++) dist[i] = Inf;
dist[start] = 0;
q.push(make_pair(0,start));
while(!q.empty()){
pill temp = q.top(); q.pop();
int x = temp.first; /*距离*/
int y = temp.second; /*该点*/
if(dist[y] != x)
continue;
for(int i = 0 ; i < G[y].size(); i++){
int a = G[y][i].l;
int b = G[y][i].cost;
int len = x + b;
if(len < dist[a]){
dist[a] = len;
q.push(make_pair(len,a));
}
}
}
for(int i = 1 ; i <= n ; i++)
ans = max(ans,dist[i]);
return ans;
}
int main(){
while(scanf("%d",&n) && n){
for(int i = 1 ; i <= n ; i++){
int m;
G[i].clear();
scanf("%d",&m);
for(int j = 0 ; j < m ; j++){
int x,y;
scanf("%d%d",&x,&y);
Line t;
t.l = x;
t.cost = y;
G[i].push_back(t);
}
}
int ans = 1 << 30;
int pos ;
for(int i = 1; i <= n ; i++){
int t = solve(i);
if(ans > t){
pos = i;
ans = t;
}
}
printf("%d %d\n",pos,ans);
}
return 0;
}