输入分析:
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;
}