http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=78207
看懂题就好。
求某一办公室到其他办公室的最短距离。
多组输入,n表示n条关系,下面n次每次输入 x y d表示x到y的距离是d。
输出办公室的编号和距离。
因为 顶点数小于10,直接floyed求出所有距离之后,枚举出最短距离即可。
1 /* *********************************************** 2 Author : zch 3 Created Time :2015/5/13 12:47:27 4 File Name :AOJ -0189 Convenient Location 5 ************************************************ */ 6 7 #include <cstdio> 8 #include <cstring> 9 #include <iostream> 10 #include <algorithm> 11 #include <vector> 12 #include <queue> 13 #include <set> 14 #include <map> 15 #include <string> 16 #include <cmath> 17 #include <cstdlib> 18 #include <ctime> 19 using namespace std; 20 const int maxn = 11; 21 const int INF = 0xfffffff; 22 int d[maxn][maxn]; 23 int n; 24 void init() 25 { 26 n=0; 27 for(int i=0; i<maxn; i++) 28 for(int j=0; j<maxn; j++) 29 if(i==j) d[i][j]=0; 30 else d[i][j]=INF; 31 32 } 33 void floyd() 34 { 35 for(int k=0; k<n; k++) 36 for(int i=0; i<n; i++) 37 for(int j=0; j<n; j++) 38 d[i][j]=min(d[i][j],d[i][k]+d[k][j]); 39 } 40 41 int main() 42 { 43 //freopen("a.txt","r",stdin); 44 //freopen("b.txt","w",stdout); 45 int m,a,b,c; 46 while(~scanf("%d",&m)&&m) 47 { 48 init(); 49 for(int i=0; i<m; i++) 50 { 51 scanf("%d%d%d",&a,&b,&c); 52 d[a][b]=d[b][a]=c; 53 n=max(n,max(a,b)+1); 54 } 55 //printf("%d\n",n); 56 floyd(); 57 int sum=0,id=0,cnt=INF; 58 for(int i=0; i<n; i++) 59 { 60 sum=0; 61 for(int j=0; j<n; j++) 62 { 63 sum+=d[i][j]; 64 } 65 if(sum<cnt) 66 { 67 cnt=sum; 68 id=i; 69 } 70 } 71 printf("%d %d\n",id,cnt); 72 } 73 return 0; 74 }
时间: 2024-10-07 04:48:57