首页 > 代码库 > POJ1125——Stockbroker Grapevine
POJ1125——Stockbroker Grapevine
输入分析:
3//输入3个点,接着是3行,每行第一个数字m,然后m组数据,每组2个数字,表示跟第ith个点相连通的点的标号和该边的权值 2 2 4 3 5 2 1 2 3 6 2 1 2 2 2
2 2 4 3 5//第1个点和两个点连通。边(1,2),权值为4; 边(1,3),权值为5 2 1 2 3 6//第2个点和两个点连通。边(2,1),权值为2; 边(2,3),权值为6 2 1 2 2 2//第3个点和两个点连通。边(3,1),权值为2; 边(3,2),权值为2
当构图完毕后,求当从该图中某点出发,将“消息”传播到整个经纪人网络的最小时间,输出这个经纪人号和最小时间。最小时间的判定方式为——从这个经纪人(结点)出发,整个经纪人网络中最后一个人接到消息的时间。如果有一个或一个以上经纪人无论如何无法收到消息,输出“disjoint”(有关图的连通性) //转自小菜鸟
很裸的floyd算法,但是题目不是很好懂
#include<iostream> #include<cstring> #include<cstdio> #define inf 9999 using namespace std; int dis[110][110]; int n; void floyd()//弗洛伊德算法,计算任意两点间的最短距离 { int i,j,k; for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(dis[i][j]>dis[i][k]+dis[k][j]) { dis[i][j]=dis[i][k]+dis[k][j]; } } } } } int main() { int i,j,m; int x,w; while(~scanf("%d",&n),n) { for(i=1;i<=n;i++)//初始化 { for(j=1;j<=n;j++) { if(i==j) dis[i][j]=0; else dis[i][j]=inf; } } for(i=1;i<=n;i++) { scanf("%d",&m); for(j=0;j<m;j++) { scanf("%d%d",&x,&w); dis[i][x]=w;//构建图 } } floyd(); int min=inf; int flag=0; for(i=1;i<=n;i++) { int max=0; for(j=1;j<=n;j++) { if(i==j) continue; if(max<dis[i][j]) { max=dis[i][j]; } } //cout<<max<<"~~~~~~"<<endl; if(max<min) { min=max; flag=i; } } if(min==inf)//说明图是没有连通 { printf("disjoint\n"); } else printf("%d %d\n",flag,min);//输出最短时间 } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。