poj 2699 The Maximum Number of Strong Kings【最大流+枚举】
因为n很小所以从大到小枚举答案。(从小到大先排个序,因为显然胜利场次越多越容易成为strong king。然后对于每个枚举出来的ans建图。点分别表示人和比赛。s向所有人连接流量为胜利场次的边,所有比赛向t连流量为1的边来限制流量,然后对于“某一方一定要赢得比赛”,也就是当前被枚举为strong king一定要赢比他赢得场次多(注意是严格大于,要把等于判掉)的人,这种情况,把一定要赢的人向这场比赛连流量为1的边。否则比赛双方都向该比赛连边,表示谁赢都可以。然后跑dinic,看最大流是否等于比赛场次。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
const int N=505,inf=1e9;
int T,n,h[N],cnt,a[N],ans,s,t,sum,le[N],id[N][N];
string c;
struct qwe
{
int ne,to,v;
}e[N];
void add(int u,int v,int w)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
e[cnt].v=w;
h[u]=cnt;
}
void ins(int u,int v,int w)
{
add(u,v,w);
add(v,u,0);
}
bool bfs()
{
queue<int>q;
memset(le,0,sizeof(le));
le[s]=1;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=h[u];i;i=e[i].ne)
if(!le[e[i].to]&&e[i].v>0)
{
le[e[i].to]=le[u]+1;
q.push(e[i].to);
}
}
return le[t];
}
int dfs(int u,int f)
{
if(u==t||!f)
return f;
int us=0;
for(int i=h[u];i&&us<f;i=e[i].ne)
if(le[e[i].to]==le[u]+1&&e[i].v>0)
{
int t=dfs(e[i].to,min(e[i].v,f-us));
e[i].v-=t;
e[i^1].v+=t;
us+=t;
}
if(!us)
le[u]=0;
return us;
}
int dinic()
{
int re=0;
while(bfs())
re+=dfs(s,inf);
return re;
}
int main()
{
scanf("%d\n",&T);
while(T--)
{
n=0;
getline(cin,c);
for(int i=c.size()-1;i>=0;)
{
while((c[i]>'9'||c[i]<'0')&&i>=0)
i--;
int r=0;
while(c[i]>='0'&&c[i]<='9'&&i>=0)
{
r=r*10+c[i]-48;
i--;
}
a[++n]=r;
}
sum=n;
sort(a+1,a+1+n);
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
id[i][j]=++sum;
s=0,t=++sum;
for(ans=n;ans>=1;ans--)
{
memset(h,0,sizeof(h));
cnt=1;
for(int i=1;i<=n;i++)
ins(s,i,a[i]);
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
ins(id[i][j],t,1);
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
{
if(i>n-ans&&a[i]!=a[j])
ins(i,id[i][j],1);
else
{
ins(i,id[i][j],1);
ins(j,id[i][j],1);
}
}
if(dinic()==n*(n-1)/2)
{
printf("%d\n",ans);
break;
}
}
}
return 0;
}
poj 2699 The Maximum Number of Strong Kings【最大流+枚举】的更多相关文章
- POJ - 2699 The Maximum Number of Strong Kings (最大流+枚举)
题意:有n(n<=10)个选手,两两之间打比赛,共有n*(n-1)/2场比赛,赢一场得1分.给出每个人最后的得分.求有多少个定义如下的strong king:赢了所有得分比自己高的人或本身就是分 ...
- POJ 2699 The Maximum Number of Strong Kings Description
The Maximum Number of Strong Kings Description A tournament can be represented by a complete graph ...
- POJ 2699 The Maximum Number of Strong Kings (最大流+枚举)
http://poj.org/problem?id=2699 题意: 一场联赛可以表示成一个完全图,点表示参赛选手,任意两点u, v之间有且仅有一条有向边(u, v)或( v, u),表示u打败v或v ...
- poj 2699 The Maximum Number of Strong Kings 枚举 最大流
题目链接 题意 对于一个竞赛图(有向完全图),其顶点是选手,边是比赛,边\(e=(u,v)\)代表该场比赛中\(u\)战胜\(v\). 现定义选手的分数为其战胜的人的个数(即竞赛图中点的出度).并且定 ...
- POJ 2699 The Maximum Number of Strong Kings ——网络流
一定存在一种最优方案,使得分数前几个人是SK 所以我们可以二分答案或者枚举,然后就是经典的网络流建模. 另:输入很Excited #include <cstdio> #include &l ...
- POJ2699:The Maximum Number of Strong Kings(枚举+贪心+最大流)
The Maximum Number of Strong Kings Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2488 ...
- POJ2699 The Maximum Number of Strong Kings
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2102 Accepted: 975 Description A tour ...
- 【POJ2699】The Maximum Number of Strong Kings(网络流)
Description A tournament can be represented by a complete graph in which each vertex denotes a playe ...
- 【POJ】【2699】The Maximum Number of Strong Kings
网络流/最大流/二分or贪心 题目大意:有n个队伍,两两之间有一场比赛,胜者得分+1,负者得分+0,问最多有几只队伍打败了所有得分比他高的队伍? 可以想到如果存在这样的“strong king”那么一 ...
随机推荐
- Linux--进程组、会话、守护进程(转)
http://www.cnblogs.com/forstudy/archive/2012/04/03/2427683.html 进程组 一个或多个进程的集合 进程组ID: 正整数 两个函数 getpg ...
- [Bzoj5179][Jsoi2011]任务调度(左偏树)
5179: [Jsoi2011]任务调度 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5 Solved: 4[Submit][Status][Di ...
- Spring基于Java的配置
以下内容引用自http://wiki.jikexueyuan.com/project/spring/java-based-configuration.html: 基于Java的配置选项,可以使你在不用 ...
- CPU 天梯图
- Myeclipse配置jad
下载地址:http://pan.baidu.com/s/1bnpMEuF 1.下载jad158g.win.zip 下载后解压.解压缩后将jad.exe拷贝到自定义的文件夹内:我这里用的是D:/jad/ ...
- sql 语句哪里添加单引号问题
1.sql 语句哪里添加单引号问题,哪些地方必须加双引号,否则sql语句会报错? :涉及varchar的值的时候,必须有单引号包括varchar值.int等其他字段类型,则不需要加单引号包括. 如: ...
- curl -s 不输出统计信息
curl -s 不输出统计信息 学习了:https://blog.csdn.net/qinyushuang/article/details/44114583
- Null value was assigned to a property of primitive type setter of原因及解决
出现Null value was assigned to a property of primitive type setter of错误是由于类型不匹配,将字段的属性由hibernate的int类型 ...
- Unity构造函数注入代码示例
Unity构造函数注入代码示例 如果使用 Unity 实例化一个类,该类的构造函数依赖一个或多个其他类,则 Unity 会为构造函数自动创建参数中指定的被依赖的类的实例.例如,下面的代码展示了一个名为 ...
- JS文件中引用另一个JS文件
1.生产项目上遇到一个Bug,需要修改JS文件,添加Jquery代码,但是原来的页面没有添加对Jquery文件的引用,无法修改原来的页面(自动生成的HTML) 这就需要在JS文件中添加对Jquery文 ...