poj 1125 最短路
题意:股票经纪人要在一群人中散布一个传言,传言只能在认识的人中传递,题目将给出人与人的关系(是否认识),以及传言在某两个认识的人中传递所需的时间,要求程序给出以哪个人为起点,可以在好事最短的情况下,让所有人收到消息。
分析:先求出每个人向其他人发信息所用的最短时间,然后在所有能向每个人发信息的人中比较他们所用最大时间,找出所用最大时间最小的那一个。
#define M 105 int maze[M][M],n; //int pre[M][M]; void floyd_warshall(){ FOR(k,0,n) FOR(i,0,n){ if(i==k)continue; FOR(j,0,n) if(maze[i][j]>maze[i][k]+maze[k][j]){ maze[i][j]=maze[i][k]+maze[k][j]; //pre[i][j]=pre[k][j]; } } } void build(){ memset(maze,0x3f,sizeof maze);//7f的话,相加得负出错 //memset(pre , -1, sizeof pre); FOR(i,0,M) { maze[i][i]=0; //pre[i][i]=i; } int a,b,m; //cin>>n; FOR(i,0,n){ cin>>m; while(m--){ cin>>a>>b; maze[i][a-1]=b; //if(i==3) cout<<"AAAAA "<<a<<' '<<b<<endl; } } } int maxx,maid; void solve(){ maxx=9999999; maid=-1; FOR(i,0,n){ int ma=-1,flag=i; FOR(j,0,n){ if(maze[i][j]>9999999){ flag=-1; break; } if(ma<maze[i][j]){ ma=maze[i][j]; } } if(flag!=-1) if(maxx>ma){ maxx=ma; maid=i; } } } int main(){ // READ while(cin>>n,n){ build(); floyd_warshall(); solve(); if(maid!=-1)cout<<maid+1<<' '<<maxx<<endl; else cout<<"disjoint"<<endl; } return 0; }