zoj1082 Stockbroker Grapevine

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1082

题目将一个“有向图中找每组点之间的最短路径”问题封装起来了。题意是你需要将一个假消息传给所有的股票操作员,但是这些人只相信他们所信赖的人,并且需要不同的时间。而且两个人之间是不对等的,也就是我相信你但是你可以不相信我。所以这就形成了一个有向图,同时每条边上面有权重。而我们需要做的就是找到一个人,保证从他那里开始传递假消息可以以最快的速度传给所有人,然后输出所需时间。那么我们就是需要在这个有向图上面找到所有的两点之间的最短路径,然后将所有点进行比较他们的传输时间。注意对于一个点,它的传输时间是依赖于所需时间最长的那个点,不是所有的时间相加,因为传输是并行的。我们通过矩阵来存储这个图,然后使用那个经典的floyd算法来实现,此算法的核心就是那个三重循环。代码如下:

#include<stdio.h> #include<string.h> int stockbroker[110][110]; int main() { int stockbrokerNumber; int manID; int minute; int trustManNum; bool checked[110]; scanf("%d",&stockbrokerNumber); while(stockbrokerNumber) { for(int i=0;i<110;i++) { checked[i] = false; for(int j=0;j<110;j++) { if(i==j) stockbroker[i][i] = 0; else stockbroker[i][j] = 10000; } } for(int i=0;i<stockbrokerNumber;i++) { scanf("%d",&trustManNum); for(int j=0;j<trustManNum;j++) { checked[j] = true; scanf("%d",&manID); scanf("%d",&minute); stockbroker[i][manID-1] = minute; checked[manID-1] = true; } } for(int i=0;i<stockbrokerNumber;i++) if(!checked[i]) { printf("disjoint/n"); goto NEXT; } for(int k=0;k<stockbrokerNumber;k++) for(int i=0;i<stockbrokerNumber;i++) for(int j=0;j<stockbrokerNumber;j++) { if(stockbroker[i][k]!=10000&&stockbroker[k][j]!=10000&&stockbroker[i][j] > stockbroker[i][k]+stockbroker[k][j]) stockbroker[i][j] = stockbroker[i][k]+stockbroker[k][j]; } int ans,ansID; ans = 30000; for(int i=0;i<stockbrokerNumber;i++) { int max = 0; for(int j=0;j<stockbrokerNumber;j++) { if(max < stockbroker[i][j]) { max = stockbroker[i][j]; } } if(ans > max) { ans = max; ansID = i; } } printf("%d %d/n",ansID+1,ans); NEXT: scanf("%d",&stockbrokerNumber); } }  

你可能感兴趣的:(算法,存储)