关闭

poj 1125

133人阅读 评论(0) 收藏 举报
分类:

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

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


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


#include <iostream>
#include <cstring>
#define N 700
using 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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6283次
    • 积分:282
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条