POJ1125-Stockbroker Grapevine【Floyd】(模板题)
<题目链接>
题目大意:
题目可能有多组测试数据,每个测试数据的第一行为经纪人数量N(当N=0时,输入数据结束),然后接下来N行描述第i(1<=i<=N)个经纪人与其他经纪人的关系(教你如何画图)。每行开头数字M为该行对应的经纪人有多少个经纪人朋友(该节点的出度,可以为0),然后紧接着M对整数,每对整数表示成a,b,则表明该经纪人向第a个经纪人传递信息需要b单位时间,该图为有向图。构图完毕后,求当从该图中某点出发,将“消息”传播到整个经纪人网络的最小时间,输出这个经纪人号和最小时间。最小时间的判定方式为——从这个经纪人(结点)出发,整个经纪人网络中最后一个人接到消息的时。如果有一个或一个以上经纪人无论如何无法收到消息,输出“disjoint”
解题分析:
由于此题起点会发生改变,并且数据很小,所以我们用Floyd算法来求多源最短路,这题需要注意的是,如何更新传播给所有人的最短时间,具体实现见代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f int main(){ int n; while(scanf("%d",&n)!=EOF,n){ int mpa[110][110]; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ mpa[i][j]=INF; //初始化所有点间距为无穷大 } } for(int i=1;i<=n;i++){ int m;scanf("%d",&m); while(m--){ int a,b; scanf("%d%d",&a,&b); if(b<mpa[i][a])mpa[i][a]=b; } } for(int k=1;k<=n;k++) //弗洛伊德得到所有点之间的最短距离 for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(mpa[i][j]>mpa[i][k]+mpa[k][j]) mpa[i][j]=mpa[i][k]+mpa[k][j]; int loc,mn=INF; for(int i=1;i<=n;i++){ int mx=-INF; for(int j=1;j<=n;j++){ if(i==j)continue; mx=max(mpa[i][j],mx); //其实这里实际上是在得到以i为起点,传播给所有的人所花的总时间,因为传播给所有人的总时间的判定方法就是传播到最远的那个人的时间 } if(mn>mx){ //更新传播给所有人的最短时间 mn=mx; loc=i; } } if(mn==INF)//如果最大值不从在,说明有未连通的点 printf("disjoint\n"); else printf("%d %d\n",loc,mn); } return 0; }
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步