hihocoder1398 网络流五之最大权闭合子图
生活随笔
收集整理的這篇文章主要介紹了
hihocoder1398 网络流五之最大权闭合子图
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最大權閉合子圖
雖然我自己現在總結不好最大權閉合子圖。但也算稍稍理解辣。
網絡流起步ing~~~(~ ̄▽ ̄)~
#include<iostream> #include<cstdio> #include<queue> #include<algorithm> using namespace std; struct node {int point;int nxt;int value; }; node line[500000]; int head[5000],tail=-1; int n,m; void add(int x,int y,int z) {line[++tail].point=y;line[tail].value=z;line[tail].nxt=head[x];head[x]=tail;line[++tail].point=x;line[tail].value=0;line[tail].nxt=head[y];head[y]=tail; } int a[5000],b[5000]; int dep[50000],cur[50000]; bool BFS(int begin,int end) {for(int i=begin;i<=end;i++){dep[i]=0;cur[i]=head[i];}queue<int>q;q.push(begin);dep[begin]=1;while(!q.empty()){int pas=q.front();q.pop();for(int i=head[pas];i!=-1;i=line[i].nxt)if(!dep[line[i].point]&&line[i].value){dep[line[i].point]=dep[pas]+1;q.push(line[i].point);}}if(dep[end])return true;return false;} int dfs(int now,int aim,int limte) {if(now==aim||!limte)return limte;int flow=0,f;for(int i=cur[now];i!=-1;i=line[i].nxt){cur[now]=i;if(dep[line[i].point]==dep[now]+1&&(f=dfs(line[i].point,aim,min(limte,line[i].value)))){flow+=f;limte-=f;line[i].value-=f;line[i^1].value+=f;if(!limte)break;} }return flow; } int dinic(int begin,int end) {int res=0;while(BFS(begin,end))res+=dfs(begin,end,0x7fffffff);return res; } int main() {int ans=0;scanf("%d%d",&n,&m);for(int i=0;i<=n+m+1;i++)head[i]=-1;for(int i=1;i<=m;i++)scanf("%d",&b[i]);int num,dat;for(int i=1;i<=n;i++){scanf("%d%d",&a[i],&num);ans+=a[i];for(int j=1;j<=num;j++){scanf("%d",&dat);add(i,n+dat,0x7fffffff);}}for(int i=1;i<=n;i++)add(0,i,a[i]);for(int i=n+1;i<=n+m;i++)add(i,n+m+1,b[i-n]);ans-=dinic(0,n+m+1);printf("%d",ans); }我的代碼,讓你感到真真的實惠石灰(逃)
轉載于:https://www.cnblogs.com/Lance1ot/p/9021738.html
總結
以上是生活随笔為你收集整理的hihocoder1398 网络流五之最大权闭合子图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: command
- 下一篇: mysql序列号发生器