Aizu 0189 Convenient Location

明年毕业的A为就业而搬家。就职的公司在若干城市都有办公室,不同天出勤的办公室也不同。所以A在考虑住在哪去各个办公室的时长最短。

你为了帮助A,决定去找最方便的居住城市。

 

城市从0号开始编号,城市之间有道路。不同的道路对应着不同的通勤时间。A 从所住的城市到该城市的办公室的通勤时间认为是 0。此时考虑到所有城市的通勤时间。例如,城市和道路的设置如图所示,A 住在城市 1 的情形下,到不同城市的通勤时间是 

到城市 0:80
到城市 1:0
到城市 2:20
到城市 3:70
到城市 4:90

,总和为 260。

输入道路的数量和所有道路的信息,求出到所有城市的通勤时间最小值和这个最小值对应的城市编号。若有多个城市的总通勤时间都是最小值,输出这些城市编号中的最小值。城市的总数不超过 10,道路的总数不超过 45,所有道路都是双向的,且两个方向的通勤时间是相等的。每个城市到其他任一城市都存在道路。

Input

有多组测试数据,输入由单行 0 终止。每个测试数据格式如下。

n
a1 b1 c1
a2 b2 c2
:
an bn cn

第1行给出道路数目 n (1 ≤ n ≤ 45) 。接下来 n 行给出第 i 个道路的信息。 ai, bi (0 ≤ ai, bi ≤ 9) 是第 i 个道路连接的城市的编号,ci (0 ≤ ci ≤ 100) 是这条道路的通勤时间。

Output

对每个测试数据,输出总通勤时间的最小值和对应最小的城市编号,由空格分开,结尾是换行符。

Sample Input

6     
0 1 80
1 2 20
0 2 60
2 3 50
3 4 60
1 4 90
2
0 1 1
1 2 1
0

Output for the Sample Input

2 240
1 2

题解:这是从一个起点到其他所有点最短路之和问题,数据量小,要求出所有点之间的最短路,所有用floyd算法;

代码如下:

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
const int inf=0x3f3f3f3f;
int n,map[50][50];
void floyd(int m)
{
    for(int k=0;k<m;k++)
    {
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(map[i][j]>map[i][k]+map[k][j])
                {
                    map[i][j]=map[i][k]+map[k][j];
                }
            }
        }
    }
}
int main()
{
    while(cin>>n,n)
    {
        int dot=0;
        for(int i=0;i<20;i++)//地图初始化很重要
        {
            for(int j=0;j<20;j++)
            {
                if(i==j) map[i][j]=0;
                else map[i][j]=map[j][i]=inf;
            }
        }
        for(int i=0;i<n;i++)
        {
            int a,b,c;
            cin>>a>>b>>c;
            if(map[a][b]>c)
            {
                map[a][b]=map[b][a]=c;
            }
            dot=max(max(dot,a),b);//找出最大标号的城市,确定起始点,0~dot;
        }
        floyd(dot+1);
        int ans=inf,k=0;
		for(int i=0;i<=dot;i++)
		{
			int minn=0;
			for(int j=0;j<=dot;j++)
			{
				if(map[i][j]!=inf)
				{
					minn+=map[i][j];
				}
			}
			if(minn<ans)
			{
				ans=minn;
				k=i;
			}
		}cout<<k<<" "<<ans<<endl;
 
    }return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值