zoukankan      html  css  js  c++  java
  • 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);
    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
    ",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);
    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
    ",cnt);
    76         printf("%d
    ",cnt*100/(n-1));
    77     }
    78     return 0;
    79 }
  • 相关阅读:
    [导入]CodeSmith基础(六)
    [导入]CodeSmith基础(五)
    POJ 2229 Sumsets(经典2次幂和问题)
    UVa 10820 Send a Table(欧拉函数)
    UVa 571 Jugs(经典倒水问题)
    UVa 10717 Mint(LCM)
    UVa 10791 Minimum Sum LCM(素因子分解)
    汇编的艺术(01)sizeof operator
    UVa 11121 Base 2(负数进制)
    UVa 106 Fermat vs. Pythagoras(毕达哥拉斯定理)
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4500726.html
Copyright © 2011-2022 走看看