题目大意:哎,意思看了半天,看了别人的解释才明白,就是说从一个经纪人出发传递消息,直到所有人都收到消息
也就是说只要找到该经纪人到其它所有点的最短距离中的最大一个时间,就说明最后一个也收到消息了。
而我们所要做的就是找到从每个经纪人为出发点的这样一个时间,再取其中最小的就是题目所要的时间了
代码如下
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxs = ;
const int INF = 0x3f3f3f3f;
int N,M;
int edge[maxs][maxs];
void dijkstra()
{
int totalTime[N+];
memset(totalTime,,sizeof(totalTime));
for(int v=;v<=N;v++)
{
int dist[maxs];//用来保存其它各点到选定点的最短距离
bool vis[maxs];//判断该点是否已经加入到集合中了
memset(vis,false,sizeof(vis));
vis[v]=true;
for(int i=;i<=N;i++)
dist[i]=edge[v][i];
for(int i=;i<=N;i++)
{
int mins=INF,k;
for(int j=;j<=N;j++)
if(!vis[j]&&dist[j]<mins)
{
mins = dist[j];
k=j;
}
vis[k]=true;//该点已经加入集合
//新的点加入,更新选定点到还没有被构造的点的最短距离
for(int j=;j<=N;j++)
if(!vis[j]&&edge[k][j]<INF&&(dist[k]+edge[k][j])<dist[j])
dist[j]=dist[k]+edge[k][j];
}
totalTime[v]=dist[];
for(int i=;i<=N;i++)
if(dist[i]>totalTime[v])
totalTime[v]=dist[i]; }
int index=;
for(int i=;i<N+;i++)
if(totalTime[i]<totalTime[index])
index=i;
if(totalTime[index]==INF)
printf("disjoint\n");
else
printf("%d %d\n",index,totalTime[index]);
}
int main()
{
freopen("in.txt","r",stdin);
while(scanf("%d",&N)!=EOF&&N)
{
for(int i=;i<=N;i++)
for(int j=;j<=N;j++)
edge[i][j]=INF;
for(int i=;i<=N;i++)
{
scanf("%d",&M);
int x,time;
edge[i][i]=;
for(int j=;j<=M;j++)
{
scanf("%d%d",&x,&time);
edge[i][x]=time;
}
}
dijkstra();
}
return ;
}