明年毕业的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;
}