POJ PKU 2699 最大流,竞赛问题
(2010-10-08 21:43:40)
标签:
pojpku2699最大流竞赛问题it |
分类: 网络流 |
题目描述:
n个人比赛, 每人都要和其余的比一场, 打败一个人得一分, 如果一个人打败了所有比自己分数高的人, 或者他本身就是分数最高的, 那么他就是Strong King, 可能有多个Strong King, 现在按非降的顺序给你每个人的得分, 问Strong King最多能有几个. n<=10.
解题报告: 转自:http://www.answeror.com/archives/27184
这是个很有意思的网络流, 题目中告诉你n<=10就是在暗示可能需要枚举, 枚举什么呢? 按以往做过的网络流题目中的惯例, 只要出现"最小的最大", "最大的最小"之类的字眼肯定就是二分答案, 这次也不例外, 只是二分变成了纯枚举.
这题建图的方法很巧妙. 设n个人得分按非降顺序排列为序列a, 首先肯定要设一个源点, 一个汇点, 在用最大流判可行性的题目中, 源点到其它顶点的弧的权值往往表示需要满足的值, 然后求出最大流跟这些值的和相比较. 那么不妨设n个顶点表示n个人, 源点向每个人连一条权值为a[i]的弧.
接下来撇开Strong King的个数不看, 我们想想比赛需要满足什么条件, 显然是每场比赛肯定有两个人参与, 但是有且只有一个人胜出, 想到什么了吗? 两条流流进来, 只有一条出去…
如果能想到将每场比赛也作为顶点就好办了, 把每个人往每场自己参与过的比赛都连一条权值为1的弧, 然后每场比赛都往汇点连一条权值为1的弧, 这就把"二选一"的要求完美地用一张图表示出来了.
那么Strong King怎么办? 假设有k个Strong King, 那么他们一定是得分最高的k个人, 并且每个人都把得分比自己高的人打败了, 怎么在图中表示A一定打败B呢? 让B退出比赛呗. 把B连向这场比赛的弧去掉, OK, A必胜了.
接下来就随便套套模板好了.
注意这题的输入非常恶心, 数字间的空格数是任意的, 行尾有任意多的空格, 最后一行可能没有换行…只有一点可以确定, 没有连续的换行.
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int t, jeo[10], n;
string x[10];
#define Max 0x1fffffff
#define size 500
struct edge{int from, to, val, next;}e[140000];
int v[size], que[size], dis[size], cnt, cur[size];
void insert(int from, int to, int va)
{
}
bool bfs(int n, int s, int t)
{
}
int Dinic(int n, int s, int t)
{