这题目,,,真是。。。诶。坑了好久。

给一个有向图。U->V表示U可以打败V并得一分。

如果一个人的得分最高,或者他打败所有比自己得分高的人,那么此人就是king。

现在给出每个人的得分,求最多可能有多少个king同时存在。

可以证明,如果有k个人是king,那么至少有一种分配方案使得这k个king都是分数最高的那k个人。(证明略,想想就知道了)

于是我们可以开始枚举从i个人开始,后面的都是king。

除了源点和汇点以外,还有两种点,一种表示人(n),一种表示比赛(n*(n/2)/2)。

如果一个人可以从一场比赛中得分,那么从人向该比赛连接一条流量为1的边。

对于当前枚举的第k个人,前面的的都不是king,那么两个人都可以连接到与该人相关的比赛,对于k以后的人,与自己编号大的人去比赛,只能是k本身获胜,这样网络流的模型就出来了。

我们从小到大枚举第一个king的位置,建图后判断能否满流即可。

此题是好题,只是。。。。这个输入就不敢恭维了。各种空格什么乱七八糟的奇怪的输入格式,一开始输入一个人数n会死哦?还有提示一个坑,如果有几个人的分数相同,那么即使他是在枚举位置的后面,他也可以输给与自己分数相同的人,特别注意了。

召唤代码君:

#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 2550
#define maxm 555500
using namespace std;const int inf=~0U>>2;
int next[maxm],to[maxm],c[maxm],first[maxn],edge;
int d[maxn],tag[maxn],f[maxn][maxn],TAG=520;
int Q[maxm],bot,top;
bool can[maxn];
int a[maxn],n,m,sum,ans,s,t,T,maxscore;
char S[maxm];void _input()
{gets(S);n=0,m=0,maxscore=0;int L=strlen(S);for (int i=0; i<L; i++){if (S[i]>='0' && S[i]<='9'){m=m*10+S[i]-'0';if (i==L-1 || S[i+1]<'0' || S[i+1]>'9')a[++n]=m,m=0,maxscore=max(maxscore,a[n]);}}for (int i=1; i<n; i++)for (int j=i+1; j<=n; j++)f[i][j]=f[j][i]=++m;//cout<<n<<' '<<m<<endl;s=0,t=n+m+1,sum=m;
}void addedge(int U,int V,int W)
{//cout<<" A edge : "<<U<<" -> "<<V<<" :: "<<W<<endl;edge++;to[edge]=V,c[edge]=W,next[edge]=first[U],first[U]=edge;edge++;to[edge]=U,c[edge]=0,next[edge]=first[V],first[V]=edge;
}bool bfs()
{Q[bot=top=1]=t,d[t]=0,tag[t]=++TAG,can[t]=false;while (bot<=top){int cur=Q[bot++];for (int i=first[cur]; i!=-1; i=next[i])if (c[i^1]>0 && tag[to[i]]!=TAG){tag[to[i]]=TAG;d[to[i]]=d[cur]+1;can[to[i]]=false;Q[++top]=to[i];if (to[i]==s) return true;}}return false;
}int dfs(int cur,int num)
{if (cur==t) return num;int tmp=num,k;for (int i=first[cur]; i!=-1; i=next[i])if (c[i]>0 && tag[to[i]]==TAG && d[to[i]]==d[cur]-1 && !can[to[i]]){k=dfs(to[i],min(c[i],num));if (k) num-=k,c[i]-=k,c[i^1]+=k;if (num==0) break;}if (num) can[cur]=true;return tmp-num;
}bool check(int x)
{edge=-1;for (int i=s; i<=t; i++) first[i]=-1;for (int i=1; i<=n; i++) addedge(s,i,a[i]);for (int i=1; i<x; i++)for (int j=i+1; j<=n; j++)addedge(i,f[i][j]+n,1),addedge(j,f[i][j]+n,1);for (int i=x; i<n; i++)for (int j=i+1; j<=n; j++){addedge(i,f[i][j]+n,1);if (a[i]==maxscore) addedge(j,f[i][j]+n,1);}for (int i=n+1; i<=n+sum; i++) addedge(i,t,1);for (ans=0; bfs(); ) ans+=dfs(s,inf);return ans>=sum;
}int main()
{scanf("%d",&T);getchar();while (T--){_input();for (int i=1; i<=n; i++)if (check(i)){printf("%d\n",n-i+1);break;}}return 0;
}

转载于:https://www.cnblogs.com/lochan/p/3854855.html

POJ2699_The Maximum Number of Strong Kings相关推荐

  1. openstack创建实例报错Exceeded maximum number of retries

    Error: 实例 "vm2" 执行所请求操作失败,实例处于错误状态.: 请稍后再试 [错误: Exceeded maximum number of retries. Exceed ...

  2. Oracle 数据库设置最大进程数参数方法,oracle最大进程数满了处理方法,sysdba管理员登录报“maximum number of processes (150) exceeded“问题解决

    oracle 数据库使用 sysdba 管理员登录报: ORA-00020: maximum number of processes (150) exceeded 译:超过了最大进程数(150) 方法 ...

  3. Linux Increase The Maximum Number Of Open Files / File Descriptors (FD)

    http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/ How do I increase the ...

  4. WCF:Maximum number of items that can be serialized or deserialized in an object graph is '65536'.

    错误 Maximum number of items that can be serialized or deserialized in an object graph is '65536'. Cha ...

  5. leetcode 330. Patching Array | 1798. Maximum Number of Consecutive Values You Can Make

    1798. Maximum Number of Consecutive Values You Can Make | 1798. 你能构造出连续值的最大数目 https://leetcode.com/p ...

  6. 321. Create Maximum Number 解题方法详解

    321. Create Maximum Number 题目描述 Given two arrays of length m and n with digits 0-9 representing two ...

  7. The number of requested virtual cores per node 3 exceeds the maximum number of virtual cores 2

    报错如下: yarn-session.sh  -tm 2048 -s 3 2020-06-08 22:24:20,317 WARN org.apache.flink.yarn.cli.FlinkYar ...

  8. ORA-00018: maximum number of sessions exceeded 超出最大会话数

    ORA-00018: maximum number of sessions exceeded ORA-00018: 超出最大会话数 Cause:       All session state obj ...

  9. tomcat调优方案Maximum number of threads (200) created for connector with address null and port 8091...

    1.tomcat6大并发出现:INFO: Maximum number of threads (200) created for connector with address null and por ...

最新文章

  1. Android中shape的使用
  2. acl在内核里的位置_Linux 进程在内核眼中是什么样子的?
  3. java 静态对象语法_04.Java 语法
  4. virtualenvwrapper
  5. Python3安装cx_Oracle连接oracle数据库实操总结
  6. 昔日的 HTC 与三星,今日的苹果:寒冬过后手机厂商才会明白的潜规则
  7. c语言将整数的各个位数的数字分别提取_C语言学习:单位转换问题的一些思路...
  8. 手工安装hr表+oracle,[20200825]手工安装HR schema.txt
  9. ThinkPHP中使用聚合查询去重求和
  10. 抖音怎么知道自己上热门 抖音是靠md5识别视频的
  11. xise菜刀千万不要随便下载!(警惕!)
  12. 【岗位技能要求】人工智能+Python
  13. mysql什么时候产生临时表_什么时候会用到临时表?MySQL临时表的使用总结
  14. 《Objective-C 程序设计(第4版)》图书信息(二)
  15. IT人才供不应求,大数据分析程序员今后的发展道路
  16. 高等数学(第七版)同济大学 习题7-4 个人解答
  17. maximo跟java_maximo中直接应用得到数据库联接
  18. AD19技术笔记-常用PCB设计思路-布线篇(一)
  19. 超越成功:经理人需提升的十二项自我管理能力
  20. jupyter notebook如何导入使用pygal模块

热门文章

  1. 给ADAS泼冷水?不,是客观评价
  2. cuDNN 5对RNN模型的性能优化
  3. 微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  4. POI操作Excel常用方法总结 .
  5. Pixysoft.Framework.Noebe.Socket 开发实录
  6. 在Red Hat Linux中自动运行程序
  7. SQL Server log备份SQL语句
  8. vs 2005 與vs 2003 語法比較
  9. Python命名空间
  10. BZOJ3526[Poi2014]Card——线段树合并