【POJ2699】The Maximum Number of Strong Kings(网络流)
2016-06-05 09:59
363 查看
Description
Atournamentcanberepresentedbyacompletegraphinwhicheachvertexdenotesaplayerandadirectededgeisfromvertexxtovertexyifplayerxbeatsplayery.ForaplayerxinatournamentT,thescoreofxisthenumberofplayersbeatenbyx.ThescoresequenceofT,denotedbyS(T)=(s1,s2,...,sn),isanon-decreasinglistofthescoresofalltheplayersinT.ItcanbeprovedthatS(T)=(s1,s2,...,sn)isascoresequenceofTifandonlyif
[POJ2699]
2016-06-0510:17:08
Atournamentcanberepresentedbyacompletegraphinwhicheachvertexdenotesaplayerandadirectededgeisfromvertexxtovertexyifplayerxbeatsplayery.ForaplayerxinatournamentT,thescoreofxisthenumberofplayersbeatenbyx.ThescoresequenceofT,denotedbyS(T)=(s1,s2,...,sn),isanon-decreasinglistofthescoresofalltheplayersinT.ItcanbeprovedthatS(T)=(s1,s2,...,sn)isascoresequenceofTifandonlyif
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> usingnamespacestd; #defineMaxn1100 #defineMaxm100100 #defineINF0xfffffff chars[1010]; inta[Maxn],al,lg[Maxn]; intdis[Maxn],first[Maxn]; structnode { intx,y,f,o,next; }t[Maxm];intlen; intst,ed,sum,h=0; intmymin(intx,inty){returnx<y?x:y;} voidins(intx,inty,intf) { if(f==0)return; if(y==ed)sum+=f; t[++len].x=x;t[len].y=y;t[len].f=f; t[len].next=first[x];first[x]=len;t[len].o=len+1; t[++len].x=y;t[len].y=x;t[len].f=0; t[len].next=first[y];first[y]=len;t[len].o=len-1; } queue<int>q; boolbfs() { while(!q.empty())q.pop(); memset(dis,-1,sizeof(dis)); q.push(st);dis[st]=0; while(!q.empty()) { intx=q.front();q.pop(); for(inti=first[x];i;i=t[i].next)if(t[i].f>0) { inty=t[i].y; if(dis[y]==-1) { dis[y]=dis[x]+1; q.push(y); } } } if(dis[ed]==-1)return0; return1; } intffind(intx,intflow) { if(x==ed)returnflow; intnow=0; for(inti=first[x];i;i=t[i].next)if(t[i].f>0) { inty=t[i].y; if(dis[y]==dis[x]+1) { inta=ffind(y,mymin(flow-now,t[i].f)); t[i].f-=a; t[t[i].o].f+=a; now+=a; } if(now==flow)break; } if(now==0)dis[x]=-1; returnnow; } boolmax_flow() { intans=0; while(bfs()) { ans+=ffind(st,INF); } if(ans==sum)return1; return0; } boolcheck(intx) { len=0;sum=0;h=ed; memset(first,0,sizeof(first)); for(inti=al-x+1;i<=al;i++) { if(a[i]<lg[i])return0; ins(i,ed,a[i]-lg[i]); for(intj=i+1;j<=al-lg[i];j++) { ins(st,++h,1); ins(h,i,1); ins(h,j,1); } } for(inti=1;i<=al-x;i++)ins(i,ed,a[i]); for(inti=1;i<=al-x;i++) for(intj=i+1;j<=al;j++) { ins(st,++h,1); ins(h,i,1); ins(h,j,1); } if(max_flow())return1; return0; } intmain() { intT; scanf("%d",&T);getchar(); while(T--) { gets(s); intl=strlen(s); intnow=0;al=0; for(inti=0;i<l;i++) { if((s[i]<='0'||s[i]>='9')&&(i>=1&&s[i-1]>='0'&&s[i-1]<='9')) { a[++al]=now; now=0; } elseif(s[i]>='0'&&s[i]<='9')now=now*10+s[i]-'0'; } if(s[l-1]>='0'&&s[l-1]<='9')a[++al]=now; for(inti=1;i<=al;i++) { lg[i]=0; for(intj=i+1;j<=al;j++)if(a[j]>a[i])lg[i]++; } st=al+1;ed=st+1;h=ed; intans=0; for(inti=al;i>=1;i--) { if(check(i)){ans=i;break;} } printf("%d\n",ans); } return0; }
[POJ2699]
2016-06-0510:17:08
相关文章推荐
- httpd之虚拟主机和默认虚拟主机
- tcp wrapper简介及nginx支持
- RTMP协议研究
- Linux网络通信工具
- Java 网络编程
- 5.2 网络训练
- JSF1063:警告!将不可序列化属性值设置为 HttpSession(密钥:{0},值类:{1})。
- go http协议和文件操作
- ppp协议基本介绍
- 推荐一个免费的论文查重网站PaperFree:http://www.paperfree.cn
- SpringMVC: HTTP Status 405 - JSPs only permit GET POST or HEAD问题的解决办法。
- ubuntu网络配置及文件
- node-http-proxy修改响应结果
- vm克隆虚拟机网络配置
- LAMP(apache/httpd+mysql+php)环境/架构 一键安装脚本
- 【学习日记】第四天-基本工具使用:TCPDUMP
- tcpflow 抓包
- Https和Http之间的区别
- Retrofit2使用方式和源码解析
- UNIX网络编程 第一章