题意是有N个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径。现在有一个消息要由某个人开始传递给其他所有人,问应该由哪一个人来传递,才能在最短时间内让所有人都接收到消息。若不存在这样一个人,则输出disjoint。
这是一道多源最短路,所以用floyd来做会比较好。
代码里有备注。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define inf 20
using namespace std;
int dist[105][105];
int n;
void floyd()
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++) //for(i=1;i<=n-1;i++)
for(j=1;j<=n;j++) //注意,只有无向图(双向边权相等)才可以使用for(j=i+1;j<=n;j++),这是因为无向图的邻接矩阵有对称性
if(i!=j && dist[i][j] > dist[i][k] + dist[k][j]) //i!=j是因为无向图的顶点(一般)不存在环
dist[i][j] = dist[i][k] + dist[k][j];
int maxlength;
int min_in_max=inf;
int flag_source;
for(i=1;i<=n;i++) //以i点作为各通路源点
{
maxlength=0;
for(j=1;j<=n;j++)
if(i!=j && maxlength<dist[i][j]) //寻找i到j的最长路径
maxlength=dist[i][j];
if(min_in_max>maxlength)
{
min_in_max=maxlength; //寻找最长路径中的最短路
flag_source=i; //该短路所在路径的源点记录
}
}
if(min_in_max<inf)
printf("%d %d\n",flag_source,min_in_max);
else
printf("disjoint\n");
return;
}
int main()
{
int i,j,k;
while(1)
{
memset(dist,inf,sizeof(dist));
scanf("%d",&n);
if(!n)break;
for(i=1;i<=n;i++)
{
int pair;
scanf("%d",&pair);
for(j=1;j<=pair;j++)
{
int cat,time; //i的接触人,接触时间(边权)
scanf("%d%d",&cat,&time);
dist[i][cat]=time;
}
}
floyd();
}
return 0;
}