Time Limit: 1000MS | Memory Limit: 10000KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
3 2 2 4 3 5 2 1 2 3 6 2 1 2 2 2 5 3 4 4 2 8 5 3 1 5 8 4 1 6 4 10 2 7 5 2 0 2 2 5 1 5 0
Sample Output
3 2 3 10
题目给出了一个股票经纪人传信息的网络,第一个N代表这个网络中有多少个股票经纪人。之后给出了每个股票经纪人的情况。他能够传给谁以及其时间,求谁传达整个网络的时间最短,最短时间又是多少。如果这个网络本身是不联通的,那就输出disjoint。
发现这些图论的算法不知道的时候特别神秘,然后知道每一个是干什么的之后才发现很多都是用一个模板去做题,当然目前自己做的题目都是图论当中比较简单的,所以自己觉得容易,以后应用的时候要好好思考。
但就这个题目来说,直接floyd套用就好了。而且这道题的数据也很水。
代码:
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #pragma warning(disable:4996) using namespace std; int num; int dis[105][105]; int dis_max[105]; void init() { int i,j; for(i=1;i<=num;i++) { for(j=1;j<=num;j++) { if(i==j) { dis[i][j]=0; } else { dis[i][j]=1005; } } } } int main() { int i,j,k,i_num; while(cin>>num) { if(num==0) break; init(); for(i=1;i<=num;i++) { cin>>i_num; int x,x_dis; for(j=1;j<=i_num;j++) { cin>>x>>x_dis; dis[i][x]=x_dis; } } for(k=1;k<=num;k++) { for(i=1;i<=num;i++) { for(j=1;j<=num;j++) { if(dis[i][k]+dis[k][j]<dis[i][j]) { dis[i][j]=dis[i][k]+dis[k][j]; } } } } for(i=1;i<=num;i++) { dis_max[i]=0; for(k=1;k<=num;k++) { if(k==i)continue; dis_max[i]=max(dis_max[i],dis[i][k]); } } int max_one=1005,max_c=0; for(i=1;i<=num;i++) { if(dis_max[i]<max_one&&dis_max[i]<=1001) { max_one=dis_max[i]; max_c=i; } } if(max_c==0) { cout<<"disjoint"<<endl; } else { cout<<max_c<<" "<<max_one<<endl; } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 1125:Stockbroker Grapevine
原文:http://blog.csdn.net/u010885899/article/details/47283279