以后还是不把原题贴出来了。就说大意。
题意:给出股市经纪人个数n,消息经过每个人需要一定时间,给出不同人之间消息传输的时间,求出从哪个人开始传输消息能最快传遍所有人。
思路:多源的最短路,Floyd!。
第一次做FLOYD:总结
算法核心
for k-n
for i-n
for j-n
map[i][j]=min(map[i][j],map[i][k]+map[k][j])
求出多源间的最短路,On^3,适合小规模的数组,凑密图。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; #define inf 0x3f3f3f int map[101][101]; void Floyd(int n) { int i,j,k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) { map[i][j]=min(map[i][j],map[i][k]+map[k][j]); } return ; } int main() { int i,j,k,time,ans,m; int mixn,maxn; int n; while(cin>>n) { if(n==0) break; ans=inf; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { map[i][j]=inf; } for(i=1;i<=n;i++) { cin>>m; map[i][i]=0; for(j=1;j<=m;j++) { cin>>k>>time; map[i][k]=time; //map[k][i]=time; } } Floyd(n); mixn=inf; for(i=1;i<=n;i++) { maxn=0; for(j=1;j<=n;j++) if(map[i][j]>maxn) maxn=map[i][j]; if(maxn<mixn) { mixn=maxn; ans=i; } } if(ans==inf) cout<<"disjoint"<<endl; else cout<<ans<<" "<<mixn<<endl; } }