您的位置:首页 > 其它

POJ 1125 Stockbroker Grapevine (Floyd)

2011-07-28 23:49 369 查看
消息传播,每个人只有从固定的人那里得到信息才会相信,且传播需要时间.求所有人都知道消息的最短时间以及消息是从哪个人发出的..
很明显的求全源最短路径,直接用Floyd就可以了.
遍历从每一个人发出消息所需要的时间,取最大值,如果不能让所有人都收到就继续遍历下一个人,如果可行就用结果跟新min值,如果所有人都不可行显然是"disjoint";
#include <cstdio>
#include <cmath>
#include <algorithm>
#define INF 1e6
using namespace std;
int n;
int d[102][102];
void init(int n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
d[i][j]=(i==j)?0:INF;
}
}
}
int main(){
//freopen("in.txt","r",stdin);
int n2,a,b;
while(scanf("%d",&n)&&n){
init(n);
for(int i=1;i<=n;i++){
scanf("%d",&n2);
for(int j=1;j<=n2;j++){//注意是有向图
scanf("%d%d",&a,&b);
d[i][a]=b;
}
}
for(int k=1;k<=n;k++){//Floyd求全源最短路径
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(d[i][j]>d[i][k]+d[k][j])d[i][j]=d[i][k]+d[k][j];
}
}
}
int mi=INF,index;//最小值,以及传播者编号
for(int i=1;i<=n;i++){
int ma=0,wrong=0;//wrong标记是否全部可通
for(int j=1;j<=n;j++){
if(d[i][j]==INF){wrong=1;break;}//不全部可通,直接退出循环
ma=max(ma,d[i][j]);
}
if(ma<mi&&!wrong){//当全部可以传播到并且小于最小值时跟新最小值
mi=ma,index=i;
}
}
if(mi!=INF)printf("%d %d\n",index,mi);
else printf("disjoint\n"); //最小值未被跟新,说明从哪个点出去都不能到达其它所有点
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: