poj 1125 Stockbroker Grapevine

题意分析:

英文太长了,好长时间都没看懂;先大体说一下题意,股票经纪人要在一群人中散布一个传言,要求时间最短。

输入要求:

多行输入;

被传播的股票经纪人的个数n,下面依次第一1
->n行递增

n行的每个开头是m组关系:先认识的人,后是传播所需时间

输出要求: 从哪个人开始传播; 最短需时

算法分析:经典的Floyd算法,三层循环;

代码:

#include
<stdio.h>

#define N 999999
int grah[101][101];
int n,m;
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(grah[i][j]>grah[i][k] + grah[k][j])
grah[i][j]
= grah[i][k] + grah[k][j];
}
int main()
{
int i,j;
// freopen("e://1.txt","r",stdin);
while(scanf("%d",&n),n)
{
for(i =1;i <=n; i++)
for(j =1;j <= n;j++)
if(i==j) grah[i][j]=0;
else grah[i][j]=N;

for(i=1;i<=n;i++)
{
scanf(
"%d",&m);
while(m--)
{
int x,y;
scanf(
"%d%d",&x,&y);
grah[i][x]
=y;
}

}
floyd();
int time=N,p;
for(i =1;i <= n; i++)
{
int max=0;
for(j =1;j <= n;j++)
{
if(grah[i][j]>max)
max
=grah[i][j];
}
if(time > max)
{
time
=max;
p
=i;
}
}
if(time != N)
printf(
"%d %d\n",p,time);
else printf("disjoint\n");
}
return0;
}

附录:

floyd算法的核心思想:

通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。

  从图的带权邻接矩阵A
=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。
  采用的是(松弛技术),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n
^3);
  其状态转移方程如下: map[i,j]:
=min{map[i,k]+map[k,j],map[i,j]}
  map[i,j]表示i到j的最短距离
  K是穷举i,j的断点
  map[n,n]初值应该为0,或者按照题目意思来做。
  当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这条路

  

posted @ 2011-08-16 22:11  skyming  阅读(261)  评论(0编辑  收藏  举报