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; }