AOJ -0189 Convenient Location && poj 2139 Six Degrees of Cowvin Bacon (floyed求任意两点间的最短路)
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 }
http://poj.org/problem?id=2139
奶牛们在玩一种游戏,游戏的规则是是这样的,奶牛到自身的距离为0,如果两个奶牛合作同一部电影,那么他们的距离为1,如果两只牛没有在一起合作过,但他们都和另一头牛合作过,那么他们距离为2,依次类推,问到其他牛的平均距离最小的多少。 输出最小平均距离乘以100。
做法跟上面一题类似,都是找一个点到其他点的最短距离。注意输出的时候可以先乘以100,这样就不会出错了。
1 /* *********************************************** 2 Author : zch 3 Created Time :2015/5/13 13:50:22 4 File Name :poj-2139 Six Degrees of Cowvin Bacon 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 = 310; 21 const int INF = 1<<29; 22 int d[maxn][maxn]; 23 int f[maxn]; 24 int n; 25 void init() 26 { 27 for(int i=0; i<=n; i++) 28 for(int j=0; j<=n; 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=1; k<=n; k++) 36 for(int i=1; i<=n; i++) 37 for(int j=1; 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,k,a,j; 46 while(~scanf("%d%d",&n,&m)) 47 { 48 init(); 49 for(int i=0; i<m; i++) 50 { 51 scanf("%d",&k); 52 for(int j=0;j<k;j++) 53 { 54 scanf("%d",&f[j]); 55 } 56 for(int x=0;x<k;x++) 57 for(int y=x+1;y<k;y++) 58 d[f[x]][f[y]]=d[f[y]][f[x]]=1; 59 } 60 //printf("%d\n",n); 61 floyd(); 62 int sum=0,cnt=INF; 63 for(int i=1; i<=n; i++) 64 { 65 sum=0; 66 for(int j=1; j<=n; j++) 67 { 68 sum+=d[i][j]; 69 } 70 if(sum<cnt) 71 { 72 cnt=sum; 73 } 74 } 75 //printf("%d\n",cnt); 76 printf("%d\n",cnt*100/(n-1)); 77 } 78 return 0; 79 }