标签:2015四川省acm省赛 网络流 最大点权独立集 最小点权覆盖集 acm
The tea party has black and green tea in service. Each frog has its own preference. He or she may drink only black/green tea or accept both.
There are
Luckily, frogs can be divided into
Frogs like gems. If the
The party manager has to dicide how to serve tea/pay gems to avoid fights, minimizing the total gems paid.
The input consists of multiple tests. For each test:
The first line contains
The third line contains
Each of the following
For each test, write
2 1
1 1
3 3
1 2
2 1
1 1
2 2
1 2
3 2
2 1 2
1 3 2
1 2
2 3
0
1
1
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> #include<queue> using namespace std; const int mmax = 2010; const int inf = 0x3fffffff; struct node { int flow; int en; int next; }E[100*mmax]; int p[mmax]; int num; void init() { memset(p,-1,sizeof p); num=0; } void add(int st,int en,int flow) { E[num].en=en; E[num].flow=flow; E[num].next=p[st]; p[st]=num++; E[num].en=st; E[num].flow=0; E[num].next=p[en]; p[en]=num++; } int d[mmax]; int cur[mmax]; bool vis[mmax]; bool bfs(int st,int en) { memset(vis,0,sizeof vis); d[st]=0; vis[st]=1; queue<int>q; q.push(st); while(!q.empty()) { int x=q.front(); q.pop(); for(int i=p[x]; i+1; i=E[i].next) { int v=E[i].en; if(!vis[v]&&E[i].flow) { vis[v]=1; d[v]=d[x]+1; q.push(v); } } } return vis[en]; } int dfs(int st,int en,int flow) { if(st==en||flow==0) return flow; int f=0,dd; for(int &i=cur[st]; i+1;i=E[i].next) { int v=E[i].en; if(d[st]+1==d[v]&&(dd=dfs(v,en,min(flow,E[i].flow)))>0) { E[i].flow-=dd; E[i^1].flow+=dd; flow-=dd; f+=dd; if(flow==0) break; } } return f; } int dinic(int st,int en,int n) { int flow=0; while(bfs(st,en)) { for(int i=0;i<=n;i++) cur[i]=p[i]; flow+=dfs(st,en,inf); } return flow; } vector<int>e[mmax]; int fg[mmax]; int w[mmax]; void dfs(int u) { int SZ=e[u].size(); for(int i=0;i<SZ;i++) { int v=e[u][i]; if(d[v]==-1) { d[v]=d[u]^1; dfs(v); } } } int main() { int n,m; while(~scanf("%d %d",&n,&m)) { for(int i=0;i<mmax;i++) e[i].clear(); for(int i=1;i<=n;i++) scanf("%d",&w[i]); int sum=0; for(int i=1;i<=n;i++) { scanf("%d",&fg[i]); if(fg[i]==3) sum+=w[i]; } for(int i=0;i<m;i++) { int u,v; scanf("%d %d",&u,&v); e[u].push_back(v); e[v].push_back(u); } init(); memset(d,-1,sizeof d); for(int i=1;i<=n;i++) { if(d[i]==-1) { d[i]=0; dfs(i); } } int st=0,en=2*n+1; for(int i=1;i<=n;i++) { if(d[i]==0) { if(fg[i]==1) add(st,i,w[i]); if(fg[i]==2) add(i,en,w[i]); if(fg[i]==3) { add(st,i,w[i]); add(i,i+n,inf); add(i+n,en,w[i]); } } else { if(fg[i]==1) add(i,en,w[i]); if(fg[i]==2) add(st,i,w[i]); if(fg[i]==3) { add(i,en,w[i]); add(st,i+n,w[i]); add(i+n,i,inf); } } } for(int u=1;u<=n;u++) { int Sz=e[u].size(); for(int i=0;i<Sz;i++) { int v=e[u][i]; if(d[u]==0 && d[v]==1) { if( (fg[u]==fg[v]) && (fg[u]!=3) ) { if(fg[u]==1) add(u,v,inf); else add(v,u,inf); } else if( (fg[u]==fg[v]) && (fg[u]==3) ) { add(u,v,inf); add(v+n,u+n,inf); } else if(fg[u]==3 || fg[v]==3 ) { if(fg[u]==3) { if(fg[v]==1) add(u,v,inf); else add(v,u+n,inf); } if(fg[v]==3) { if(fg[u]==1) add(u,v,inf); else add(v+n,u,inf); } } } } } printf("%d\n",dinic(st,en,en)-sum); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
scu oj 4442 Party(2015年四川省acm程序设计竞赛)
标签:2015四川省acm省赛 网络流 最大点权独立集 最小点权覆盖集 acm
原文地址:http://blog.csdn.net/u012127882/article/details/47397919