floyd:全源最短路径算法的应用 poj1125
这道题是poj1125
大意如下题意:众所周知,证券经纪业依靠的就是过度的传言。您需要想出股票经纪人中传播假情报的方法,让您的雇主在股票市场的占据优势。为了获得最大的效果,你必须蔓延最快的方式谣言。
不幸的是你,股票经纪人信息只信任他们的“可靠来源”,这意味着你在你传播谣言之前必须考虑到他们的接触结构。它需要特定股票经纪人和一定的时间把谣言传递给他的每一位同事。你的任务将是写一个程序,告诉您选择哪一个股票经纪人作为谣言的出发点和所花费多少时间将谣言扩散到整个社会的股票经纪人。这一期限是衡量过去的人收到信息所需的时间。
输入
你的程序包含多组股票经纪人的输入数据。每组以股票经纪人的人数开始。接下来的几行是每个经纪人与其他人接触的一些信息,包括这些人都是谁,以及将讯息传达到他们所需的时间。每个经纪人与其他人接触信息的格式如下:开头的第一个数表示共有n个联系人,接下来就有n对整数。每对整数列出的第一个数字指的是一个联系人(例如,一个'1'是指编号1的人),其次是在传递一个信息给那个人时所采取分钟的时间。没有特殊的标点符号或空格规则。 每个人的编号为1至经纪人数目。所花费的传递时间是从1到10分钟(含10分种)。股票经纪的人数范围是从1到100。当输入股票经纪人的人数为0时,程序终止。
题目大意是股票经纪人要在一群人中散布一个谣言,而谣言只能在亲密的人中传递,题目各处了人与人之间的关系及传递谣言所用的时间,要求程序给出应以那个人为起点,可以在最短的时间内让所有的人都得知这个谣言。要注意从a到b传递的时间不一定等于从b到a的时间,如果没有方案能够让每一个人都知道谣言,则输出"disjoint"。
题目数据的输入第一行为n,代表总人数,当n=0时结束程序,接着n行,第i+1行的第一个是一个整数t,表示第i个人与t个人的关系要好,接着有t对整数,每对的第一个数是j,表示i与j要好,第二个数是从i直接传递谣言到j所用的时间,数据的输出是两个整数,第一个为选点的散布谣言的起点,第二个整数时所有人得知谣言的最短时间
这道题应该是说每个人把一些消息传给别人是要花一定时间的,所以,我们只需要求出以这个人为核心的所有次单源最短路径,然后分两种情况,一种是可以不到一个人那里,则这个人弄死都无法传到全部人,如果所有人都是这种情况,,就是disjiont,否则就一定有解,在求出所有情况中的最小情况就可以了。(*^▽^*)垃圾floyd裸题
#include<cstdio> #include<algorithm> #define INF 0x3fffffff #define N 100+10 using namespace std; int g[N][N]; int main() { int n; while(scanf("%d",&n)==1&&n) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) g[i][j]=INF; for(int i=1;i<=n;i++) { int m; scanf("%d",&m); for(int j=1;j<=m;j++) { int x,y; scanf("%d%d",&x,&y); g[j][x]=y; } } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) g[i][j]=min(g[i][j],g[i][k]+g[k][j]); int minw=INF; int mink=-1; for(int k=1;k<=n;k++) { int maxw=0; for(int i=1;i<=n;i++) { if(k!=i&&g[k][i]>maxw) { maxw=g[k][i]; } } if(maxw<minw) { minw=maxw; mink=k; } } printf("%d %d",mink,minw); } return 0; }