题目大意:就是一群牛,又在玩游戏了(怎么你们经常玩游戏),这个游戏规则如下,把牛拆分成一个一个组,并且定义一个“度”,规定在一个组的牛与他自己的度为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 }