1001-Winner Prediction
题目大意:
一场比赛两个人之间进行,赢的人加一分,目前已知一些结束比赛的结果,还剩下若干场没有进行的比赛,且每场比赛的两个玩家已知。问1号玩家是否有可能成为分数最高的玩家(并列也算)。
思路:
一开始想的是贪心,未开始的比赛,如果有1号玩家参与,就让1号玩家赢,否则每次选一个分数最高的玩家,在他的所有比赛中选一场对手分数最低的比赛,让分数低的玩家赢。但是这样的贪心无法证明是正确的。
后来也想过用网络流,但是因为太久没用过了,有些生疏,没有把图建起来。赛后看题解果然也是用网络流做的。
建图的方式:
源点向每场比赛连一条容量为1的边。
每场比赛向两位选手各连一条容量为1的边。
每位选手向汇点连一条边,容量为1号玩家分数 - 自己当前的分数。
然后套板子跑最大流即可。如果汇点的流量为比赛的场数,说明有解。
AC代码:
#include <bits/stdc++.h>
#define M 20005
#define N 2005
#define mem(a, v) memset(a, v, sizeof(a))
#define inf 0x3f3f3f3f
using namespace std;
struct edge
{
int to, next;
int cap;
} e[M];
int head[N], ecnt = 1;
int dep[N], cur[N], S, T, tot;
void add(int u, int v, int cap)
{
e[++ecnt] = edge{
v, head[u], cap};
head[u] = ecnt;
e[++ecnt] = edge{
u, head[v], 0};
head[v] = ecnt;
}
bool bfs()
{
for (int i = 1; i <= tot; i++)
dep[i] = 0, cur[i] = head[i];
dep[S] = 1;
queue<int> q;
q.push(S);
while (q.

本文解析了两道算法竞赛题目,1001-WinnerPrediction关注比赛策略以使1号玩家可能成为最高分者,利用网络流解决;1004-AverageReplacement探讨点权更新问题,通过连通分量和度数分析得出最终点权。
最低0.47元/天 解锁文章
930

被折叠的 条评论
为什么被折叠?



