题目描述:
输入输出:
Input | Output |
5 5 | 2 |
4 3 | |
4 2 | |
3 2 | |
1 2 | |
2 5 |
思路:
整体思路差不多就是说某个牛勇士打败了其余剩下所有的牛勇士的话,这个牛勇士就是勇士总冠军的金杯获得者。那么题目里看懂了这条信息,剩下的就不难做,这题的正解是利用邻接矩阵存图,将A牛能打败B牛赋值为1,反之则赋值为2。因为其可能存在负环的情况,所以我用Floyd三次for循环跑一遍,利用之前存的数值“1”、“2”来找出哪两条边直接存在关系,再用get_Ans函数用ans变量记录一下有多少个牛勇士能拿到勇士总冠军的金啵啵(bushi),在将金啵啵平均分成ans个,每个人拿金啵啵的1/ans个(bushi)
Folyd部分:
void floyd()
{
for (int k = 1; k <= n; k++) // floyd算法
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
// a>b,b>c所以a>c 或 a<b,b<c所以a<c
if ((maps[i][k] == 1 && maps[k][j] == 1) || (maps[i][k] == 2 && maps[k][j] == 2))
maps[i][j] = maps[i][k];
}
}
}
记录答案的部分:
int getAns() // 扫描有多少个点满足与其它点都有关系
{
int sum = 0;
for (int i = 1; i <= n; i++)
{
int flag = 1;
for (int j = 1; j <= n && flag; j++)
{
if (i != j && maps[i][j] == 0)
flag = 0; // 表示存在一个点与i点没关系
}
if (flag)
sum++;
}
return sum;
}
AC代码:
// Floyd
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 105;
const int INF = 1e9;
int maps[N][N];
int d[N];
int n, m;
void init()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
maps[i][j] = 0; // 初始化各点都没关系
}
/*
1->2:3
2->3:4
1->3:3+4
*/
void floyd()
{
for (int k = 1; k <= n; k++) // floyd算法
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
// a>b,b>c所以a>c 或 a<b,b<c所以a<c
if ((maps[i][k] == 1 && maps[k][j] == 1) || (maps[i][k] == 2 && maps[k][j] == 2))
maps[i][j] = maps[i][k];
}
}
}
int getAns() // 扫描有多少个点满足与其它点都有关系
{
int sum = 0;
for (int i = 1; i <= n; i++)
{
int flag = 1;
for (int j = 1; j <= n && flag; j++)
{
if (i != j && maps[i][j] == 0)
flag = 0; // 表示存在一个点与i点没关系
}
if (flag)
sum++;
}
return sum;
}
int main()
{
cin >> n >> m;
init();
for (int j = 1; j <= m; j++)
{
int a, b;
cin >> a >> b;
maps[a][b] = 1; // 表示大于关系
maps[b][a] = 2; // 表示小于关系
}
floyd();
int ans = getAns();
cout << ans << endl;
return 0;
}
总结:比较水的一道题,但我还是没做出来。。错点就是没能想到用“1”,“2”来记录战况的最优解法。
创作不易,请勿白嫖啊www!麻烦给作者个赞+三连!谢谢!