P3701 -「伪模板」主席树【网络流,最大流】
生活随笔
收集整理的這篇文章主要介紹了
P3701 -「伪模板」主席树【网络流,最大流】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
評測記錄:https://www.luogu.org/recordnew/lists?uid=52918&pid=P3701
題目大意
給出若干個人的克制關系
給出兩邊每個人的種類和血量。當兩個人pkpkpk后,雙方各?1hp-1hp?1hp,同一邊的YYYYYYYYY可以給每個同一方的J+1hpJ\ +1hpJ?+1hp,血量為0時就不能pkpkpk了,兩個人之間不能重復pkpkpk。每次選兩個人出來比賽,比賽mmm輪,求第一方最多能贏多少次。
解題思路
因為pk多次我們考慮網絡流。
每次pk作為一個流量。
然后一個人能pk x(算上YYY給J的+1hp)次的話就用原點連這個點一條x的邊。另一個邊的就連匯點,然后可以擊敗就連一條1的邊。
如樣例
3 3
J W YYY
J HK E
2 2 2
2 2 2
圖的情況
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define N 2100 using namespace std; struct line{int to,next,w; }a[N*10]; struct player{char id[5]; }p[N],p2[N]; int n,m,x,y,d[N],tot=2,state[N],hp; int head,tail,ls[N],s,e,ans,w,YYY1,YYY2; void addl(int x,int y,int w)//建邊 {a[tot].to=y;a[tot].next=ls[x];a[tot].w=w;ls[x]=tot++;a[tot].to=x;a[tot].next=ls[y];a[tot].w=0;ls[y]=tot++; } bool bfs() {head=0;tail=1;memset(d,-1,sizeof(d));d[s]=0;state[1]=s;do{head++;int x=state[head];for (int q=ls[x];q;q=a[q].next){int y=a[q].to;if (a[q].w>0 && d[y]==-1){d[y]=d[x]+1;state[++tail]=y;if (y==e) return true;}}}while (head<tail);return false; } int dinic(int x,int flow) {int rest=0,k;if (x==e) return flow;for (int q=ls[x];q;q=a[q].next){int y=a[q].to;if (a[q].w>0 && d[y]==d[x]+1){rest+=(k=dinic(y,min(a[q].w,flow-rest)));a[q].w-=k;a[q^1].w+=k;}}if (!rest) d[x]=0;return rest; } int main() {scanf("%d%d",&n,&m);e=n*2+2;s=n*2+1;for(int i=1;i<=n;i++) {scanf("%s",p[i].id);if(p[i].id[0]=='Y') YYY1++;}for(int i=1;i<=n;i++){scanf("%s",p2[i].id);if(p2[i].id[0]=='Y') YYY2++;}//以上為讀入和記錄YYY的個數for(int i=1;i<=n;i++){scanf("%d",&hp);if(p[i].id[0]=='J') addl(s,i,hp+YYY1);else addl(s,i,hp);}for(int i=1;i<=n;i++){scanf("%d",&hp);if(p2[i].id[0]=='J') addl(i+n,e,hp+YYY2);else addl(i+n,e,hp);}//以上為輸入hp和主席特盤for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){char s1=p[i].id[0],s2=p2[j].id[0];if(s1=='E'&&(s2=='J'||s2=='Y')) addl(i,j+n,1);if(s1=='Y'&&(s2=='J'||s2=='H')) addl(i,j+n,1);if(s1=='H'&&(s2=='E'||s2=='W')) addl(i,j+n,1);if(s1=='W'&&(s2=='Y'||s2=='E')) addl(i,j+n,1);if(s1=='J'&&(s2=='H'||s2=='W')) addl(i,j+n,1);}}//擊敗連邊while (bfs())ans+=dinic(s,1e9);if(ans>m) printf("%d",m);//對于m的特判else printf("%d",ans); } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的P3701 -「伪模板」主席树【网络流,最大流】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国之重器!“精密重力测量研究设施”项目建
- 下一篇: nssl1155-遨游【二分答案,SPF