poj 1125

来源:互联网 发布:背六级英语单词的软件 编辑:程序博客网 时间:2024/06/04 09:01

题目大意:(我就不翻译原来的题目)大概讲的是这么个东西。

给出几个点以及点到其他点的单向边。现在假设有一个消息要传给所有人,我们认为每个点到其他点传递消息的时间为边的长度。现在所求的是:从那个点出发所需的时间最少,并且求出这个最小值。


还是最短路径问题:求出每个点到其他点的最短路径(floyd算法),之后枚举每个点,求出这个点要把消息传遍的最长的时间,找出时间最短的点,很简单。


#include <iostream>#include <cstring>#define N 700using namespace std;int dis[N][N];int n,m;int main(){while(1){cin>>n;if(n==0)break;for (int i=0;i<N;++i)  for (int j=0;j<N;++j)    dis[i][j]=99999999;      for (int i=1;i<=n;++i)    {    cin>>m;    int v=0,d;    for (int j=1;j<=m;++j)    {    cin>>v>>d;    dis[i][v]=d;}dis[i][i]=0;}for (int i=1;i<=n;++i)  for (int j=1;j<=n;++j)    for (int k=1;k<=n;++k)           //Floyd    dis[i][k]=min( dis[i][j]+dis[j][k] , dis[i][k]);    int ans=99999999+1,k=-1;for (int i=1;i<=n;++i){int cnt=0;for (int j=1;j<=n;++j)cnt=max(dis[i][j],cnt);   //枚举点求最小 if(cnt<ans){ans=cnt;k=i;}}cout<<k<<' '<<ans<<endl;}}

这是第一次,第一次直接ac的题目!!!!

当然我发现自己floyd写得不是很顺,三个循环把自己搞晕了。


for (int k=0;k<n;++k)  

   for (int i=0;i<n;++i)  

      for (int j=0;j<n;++j)

         d[i][j]=min(d[i][k]+d[k][j],d[i][j]); 

//从第i个点到第j个点以k为中间点所需的最短距离

//第一个循环枚举的是中间点

//第二个循环枚举的是当前中间点下的起始点

//第三个循环美剧的是目标。

仔细想想为什么不能换。



0 0
原创粉丝点击