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]这条路
Just a little, maybe change the world