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\n", min_sum * 100 / (cow_sum - 1));
75 }

posted @ 2015-10-24 23:39  PhiliAI  阅读(395)  评论(0编辑  收藏  举报