zoukankan      html  css  js  c++  java
  • ShortestPath:Six Degrees of Cowvin Bacon(POJ 2139)

                    

                     牛与电影

      题目大意:就是一群牛,又在玩游戏了(怎么你们经常玩游戏),这个游戏规则如下,把牛拆分成一个一个组,并且定义一个“度”,规定在一个组的牛与他自己的度为0,与其他牛的度为1,不同组的牛不存在度,但是如果牛与牛之间有联系,那么度就会想加,这一题所有的牛都会与其他所有的牛有联系,问你哪只牛与其他牛的度的总数最少,求这个总数的平均值。

      那么这一题貌似把牛拆分成一个一个的区间,但是我们仔细想一下,其实啊这个组是不重要的,他只是影响了牛与牛之间有没有直接相连,其实仔细读下来我们直接建图就可以了,每一次一个组的信息我们都把组内的牛建立联系就行了

      现在要求所有牛的最短距离,那么就是用Floyd算法了,很简单的代码

      

     1 #include <iostream>
     2 #include <functional>
     3 #include <algorithm>
     4 #define MAX_N 301
     5 
     6 using namespace std;
     7 
     8 static int Gragh[MAX_N][MAX_N];
     9 static int Dist[MAX_N][MAX_N];
    10 static int tmp[MAX_N];
    11 
    12 void Create_Gragh(const int);
    13 void Search(const int);
    14 
    15 int main(void)
    16 {
    17     int Movie_sum, cow_sum, in_movie_sum;
    18     while (~scanf("%d%d", &cow_sum, &Movie_sum))
    19     {
    20         memset(Gragh, 0, sizeof(Gragh));
    21         for (int i = 0; i < Movie_sum; i++)
    22         {
    23             scanf("%d", &in_movie_sum);
    24             for (int j = 0; j < in_movie_sum; j++)
    25                 scanf("%d", &tmp[j]);
    26             Create_Gragh(in_movie_sum);
    27         }
    28         Search(cow_sum);
    29     }
    30     return 0;
    31 
    32 }
    33 
    34 void Create_Gragh(const int in_movie_sum)
    35 {
    36     for (int i = 0; i < in_movie_sum; i++)
    37     {
    38         for (int j = i + 1; j < in_movie_sum; j++)
    39         {
    40             Gragh[tmp[i]][tmp[j]] = 1;
    41             Gragh[tmp[j]][tmp[i]] = 1;
    42         }
    43     }
    44 }
    45 
    46 void Search(const int cow_sum)//Floyd算法,dp数组
    47 {
    48     int min_sum = INT_MAX, sum;
    49     for (int i = 1; i <= cow_sum; i++)//初始化
    50     {
    51         for (int j = 1; j <= cow_sum; j++)
    52         {
    53             if (i == j) Dist[i][j] = 0;
    54             else if (Gragh[i][j] == 1) Dist[i][j] = 1;
    55             else Dist[i][j] = MAX_N + 1;
    56         }
    57     }
    58     for (int k = 1; k <= cow_sum; k++)//最短寻路
    59     {
    60         for (int i = 1; i <= cow_sum; i++)
    61             for (int j = 1; j <= cow_sum; j++)
    62             {
    63                 if (i == j) continue;
    64                 Dist[i][j] = min(Dist[i][j], Dist[i][k] + Dist[k][j]);
    65             }
    66     }
    67     for (int i = 1; i <= cow_sum; i++)//和其他点都有关系,我们找到那个最小平均值即可
    68     {
    69         sum = 0;
    70         for (int j = 1; j <= cow_sum; j++)
    71             sum += Dist[i][j];
    72         min_sum = sum < min_sum ? sum : min_sum;
    73     }
    74     printf("%d
    ", min_sum * 100 / (cow_sum - 1));
    75 }

  • 相关阅读:
    Python购物车的实现课程
    第一天作业二 三级菜单的实现
    windows快捷键命令汇总整理
    python课程第一天作业1-模拟登录
    Java中的代理
    Java中的继承
    Java中的访问权限细谈
    Java中的参数列表
    Java中的this关键字老生常谈
    数据结构与算法Java描述 队列
  • 原文地址:https://www.cnblogs.com/Philip-Tell-Truth/p/4908041.html
Copyright © 2011-2022 走看看