-
Stockbroker Grapevine
- POJ - 1125
- 题意:哪个证券经纪人作为流言传播的起点,以及这个流言传播完整个经纪人社群所需的时间。所需的时间指的是最后一个经纪人接受到消息所花费的时间。
- 思路:跑一边多源最短路,枚举每个点dp更新最小值即可,当时一直没想明白最后一个人收到消息的最短时间其实就是以这个人为起点到达其他所有点中的花费时间最长的一个值就是这个人发送消息后最后一个人收到消息的时间
-
#include<stdio.h> #include<iostream> using namespace std; #define ll long long #define maxn 155 #define inf 0x3f3f3f3f int d,s,t,u,v,w,n,m,T; int mmp[maxn][maxn]; int dp[maxn],ans,ord; void floyd() { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(mmp[i][k]+mmp[k][j]<mmp[i][j]) mmp[i][j]=mmp[i][k]+mmp[k][j]; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) dp[i]=max(mmp[i][j],dp[i]); if(dp[i]<ans) { ans=min(ans,dp[i]); ord=i; } } } int main() { while(scanf("%d",&n)) { if(n==0) break; ans=inf; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(i==j) mmp[i][j]=0; else mmp[i][j]=inf; } dp[i]=0; } for(int i=1; i<=n; i++) { scanf("%d",&m); while(m--) { scanf("%d%d",&v,&w); mmp[i][v]=w; } } floyd(); if(ans!=inf) printf("%d %d\n",ord,ans); else printf("disjoint\n"); } return 0; }
Stockbroker Grapevine -最短路+dp
最新推荐文章于 2019-04-29 18:57:21 发布