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 }

 

posted @ 2015-05-13 16:01  NowAndForever  阅读(245)  评论(0编辑  收藏  举报