您的位置:首页 > 理论基础 > 计算机网络

【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

#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


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: