直接翻譯了ios
Descriptions算法
明年畢業的A爲就業而搬家。就任的公司在若干城市都有辦公室,不一樣天出勤的辦公室也不一樣。因此A在考慮住在哪去各個辦公室的時長最短。測試
你爲了幫助A,決定去找最方便的居住城市。spa
城市從0號開始編號,城市之間有道路。不一樣的道路對應着不一樣的通勤時間。A 從所住的城市到該城市的辦公室的通勤時間認爲是 0。此時考慮到全部城市的通勤時間。例如,城市和道路的設置如圖所示,A 住在城市 1 的情形下,到不一樣城市的通勤時間是
到城市 0:80
到城市 1:0
到城市 2:20
到城市 3:70
到城市 4:90
總和爲 260。.net
輸入道路的數量和全部道路的信息,求出到全部城市的通勤時間最小值和這個最小值對應的城市編號。如有多個城市的總通勤時間都是最小值,輸出這些城市編號中的最小值。城市的總數不超過 10,道路的總數不超過 45,全部道路都是雙向的,且兩個方向的通勤時間是相等的。每一個城市到其餘任一城市都存在道路。翻譯
Inputcode
有多組測試數據,輸入由單行 0 終止。每一個測試數據格式以下。blog
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) 是這條道路的通勤時間。ip
Outputci
對每一個測試數據,輸出總通勤時間的最小值和對應最小的城市編號,由空格分開,結尾是換行符。
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
題目連接
https://vjudge.net/problem/Aizu-0189
經典Floyd算法求最短路,模板題,沒啥說的
AC代碼
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string>1 #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define IOS ios_base::sync_with_stdio(0); cin.tie(0) #define Mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x,y) memset(x,y,sizeof(x)) #define Maxn 50 #define P pair<int,int> using namespace std; int n; int maxx;//編號最大的城市爲maxx int d[Maxn][Maxn];//d[i][j]從i到j的最短距離 //Floyd算法求各個城市之間的最短距離 void Floyd() { for(int k=0; k<=maxx;k++) for(int i=0;i<=maxx;i++) for(int j=0;j<=maxx;j++) d[i][j]=min(d[i][k]+d[k][j],d[i][j]); } int main() { IOS; while(cin>>n,n) { MEM(d,INF);//初始化城市距離,兩兩之間的距離爲無窮大 for(int i=0;i<=n;i++) d[i][i]=0;//i到i的距離爲0 maxx=-1; while(n--) { int a,b,c; cin>>a>>b>>c; maxx=max(maxx,max(a,b)); d[a][b]=d[b][a]=c; } Floyd();//求最短距離 int ans=INF;//總距離 int pos;//編號爲pos的城市 for(int i=0;i<=maxx;i++)//枚舉i到各個城市之間的距離 { int sum=0; for(int j=0;j<=maxx;j++) sum+=d[i][j]; if(ans>sum) { ans=sum; pos=i; } } cout<<pos<<" "<<ans<<endl; } return 0; }