poj1125 Stockbroker Grapevine
数据貌似很水的样子。用了N次Dijkstra来计算每点到其他各点距离的最大值,时间复杂度还是蛮大的,结果也是0ms。
英语不好伤不起啊,题目看了好久才知道在干嘛。
#include<iostream> #include<stdio.h> #include<string.h> #include<queue> #include<vector> #define MAXD 110 #define INF 0x3f3f3f3f using namespace std; int N,data[MAXD][MAXD],d[MAXD]; bool graph[MAXD][MAXD]; class cmp { public: bool operator()(int a,int b) { return d[a]>d[b]; } }; void Dijkstra(int src) { priority_queue<int,vector<int>,cmp > que; bool vis[MAXD]; memset(vis,0,sizeof(vis)); memset(d,0x3f,sizeof(d)); d[src]=0; que.push(src); int t; int i; while(!que.empty()) { t=que.top(); vis[t]=true; que.pop(); for(i=1;i<=N;i++) { if(!vis[i]&&graph[t][i]&&d[i]>d[t]+data[t][i]) { d[i]=d[t]+data[t][i]; que.push(i); } } } } int max() { int i,ans=0; for(i=1;i<=N;i++) { if(ans<d[i]) ans=d[i]; } return ans; } int main() { //freopen("test.txt","r",stdin); while(scanf("%d",&N)!=EOF) { if(N==0) return 0; int i,j,m,t; memset(graph,0,sizeof(graph)); for(i=1;i<=N;i++) { scanf("%d",&m); for(j=1;j<=m;j++) { scanf("%d",&t); scanf("%d",&data[i][t]); graph[i][t]=true; } } int flag=0,ans=INF; for(i=1;i<=N;i++) { Dijkstra(i); if(ans>max()) { ans=max(); flag=i; } } if(flag==0) printf("disjoint\n"); else printf("%d %d\n",flag,ans); } return 0; }