[洛谷P1231] 教辅的组成
生活随笔
收集整理的這篇文章主要介紹了
[洛谷P1231] 教辅的组成
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目大意:有n1本書,n2本練習冊和n3個答案,然后又一些條件,說明某本答案可能和某本書對應,某本練習冊可能和某本書對應,求最多有多少本完整的書(有書,練習冊,答案)
題解:網(wǎng)絡流,對應就連邊,然后考慮一本書可能有多條邊相連導致答案變大,就把書拆成兩個點,邊權(quán)為1
卡點:1.前向星cnt初值為0,就有一條邊無法遍歷到,應該賦2
?
C++ Code:
#include<cstdio> #include<cstring> using namespace std; const int inf=0x3f3f3f3f; inline int min(int a,int b){return a<b?a:b;} int n1,n2,n3,m1,m2; int a,b,end,start=1; int cnt=2,head[50010]; int d[50010]; struct Edge{int to,nxt,cost; }e[150010]; int q[150010],h,t; void add(int a,int b,int c){e[cnt]=(Edge){b,head[a],c};head[a]=cnt;e[cnt^1]=(Edge){a,head[b],0};head[b]=cnt^1;cnt+=2; } bool bfs(){memset(d,0,sizeof d);d[q[h=t=1]=start]=1;while (h<=t){int x=q[h++]; // if (x==end)printf("%d\n",d[end]);if (x==end)return true;for (int i=head[x];i;i=e[i].nxt){int to=e[i].to;if ((!d[to])&&e[i].cost){d[to]=d[x]+1;q[++t]=to;}}}return d[end]; } int dfs(int x,int low){if ((x==end))return low;int res=0,w;for (int i=head[x];i;i=e[i].nxt){int to=e[i].to;if ((d[to]==d[x]+1)&&e[i].cost){w=dfs(to,min(low-res,e[i].cost)); // printf("%d\n",w);e[i].cost-=w;e[i^1].cost+=w;res+=w;if (res==low)return res;}}if (!res)d[x]=-1;return res; } void dinic(){int ans=0;while (bfs()){int k=dfs(start,inf);if (k>0)ans+=k; // printf("%d\n",ans);}printf("%d\n",ans); } int main(){scanf("%d%d%d",&n1,&n2,&n3);scanf("%d",&m1);for (int i=0;i<m1;i++){scanf("%d%d",&a,&b);add(b+1,n2+a+1,1);}scanf("%d",&m2);for (int i=0;i<m2;i++){scanf("%d%d",&a,&b);add(n1+n2+a+1,(n1<<1)+n2+b+1,1);}end=(n1<<1)+n2+n3+2;for (int i=1;i<=n2;i++)add(start,i+1,1);for (int i=1;i<=n3;i++)add((n1<<1)+n2+i+1,end,1);for (int i=1;i<=n1;i++)add(n2+i+1,n1+n2+i+1,1);dinic();return 0; }
轉(zhuǎn)載于:https://www.cnblogs.com/Memory-of-winter/p/9090069.html
總結(jié)
以上是生活随笔為你收集整理的[洛谷P1231] 教辅的组成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: axure怎么转换成html文件,Axu
- 下一篇: sklearn官网-多分类问题