您的位置:首页 > 其它

codeforces gym 100357 I (费用流)

2017-05-01 00:03 232 查看
题目大意

 

#include <bits/stdc++.h>
using namespace std;

#define rep(i,x,y) for (int i=x;i<=y;i++)
const int N=1000;
const int INF=2000000000;

int n,m,S,T,sum,minC,maxF;
int lt[N*4],flag
,dis[N*4],pd[N*4],pre[N*4],sgn[N*4];
vector <int> vec
;

struct edge{
int u,v,f,w,nt;
}eg[N*6];

void add(int u,int v,int f,int w)
{
//cout<<u<<" "<<v<<" "<<f<<" "<<w<<endl;
eg[++sum]=(edge){u,v,f,w,lt[u]}; lt[u]=sum;
eg[++sum]=(edge){v,u,0,-w,lt[v]}; lt[v]=sum;
}

bool spfa()
{
queue <int> Q;
rep (i,S,T) dis[i]=INF,pd[i]=0,pre[i]=-1;
dis[S]=0; pd[S]=1; Q.push(S);
while (!Q.empty())
{
int u=Q.front();
for (int i=lt[u];i;i=eg[i].nt)
{
int v=eg[i].v;
if (eg[i].f>0)
{
if (dis[u]+eg[i].w<dis[v])
{
dis[v]=dis[u]+eg[i].w;
pre[v]=i;
if (!pd[v])
{
Q.push(v);
pd[v]=1;
}
}
}
}
pd[u]=0; Q.pop();
}
return dis[T]!=INF;
}
void minCmaxF()
{
int flow;
while (spfa())
{
flow=INF;
for (int i=pre[T];~i;i=pre[eg[i].u])
flow=min(flow,eg[i].f);
for (int i=pre[T];~i;i=pre[eg[i].u])
eg[i].f-=flow,eg[i^1].f+=flow;
maxF+=flow;
minC+=flow*dis[T];
}
}

int main()
{
freopen("sat.in","r",stdin);
freopen("sat.out","w",stdout);

cin.sync_with_stdio(0);
sum=1; memset(lt,0,sizeof(lt));
int limit=0;

cin>>n>>m;
S=0; T=3*n+m+1;
rep(i,1,m)
{
int num; cin>>num;
rep(j,1,num)
{
int x; cin>>x;
flag[abs(x)]++;
if (x>0) sgn[x]=1; else sgn[x]=-1;
vec[i].push_back(x);
}
}
rep(i,1,n) if (flag[i]==2) add(S,i,1,-1),limit++; else add(S,i,1,0);
rep(i,1,n) {add(i,n+2*i-1,1,0); add(i,n+2*i,1,0);}
rep(i,1,m)
{
for (auto v:vec[i])
{
int x=v>0?n+2*abs(v)-1:n+2*abs(v);
add(x,n*3+i,1,0);
}
add(3*n+i,T,1,0);
}
minC=maxF=0;
minCmaxF();
vector <int> ans;
if (minC==-limit && maxF==m)
{
cout<<"YES"<<endl;
for (int i=lt[S];i;i=eg[i].nt)
{
if (eg[i].f==1)
{
if (sgn[eg[i].v]==1) ans.push_back(0); else ans.push_back(1);
}
else
{
if (eg[lt[eg[i].v]].f==0) ans.push_back(0); else ans.push_back(1);
}
}
for (int i=ans.size()-1;i>=0;i--) cout<<ans[i]<<" ";
cout<<endl;
}
else cout<<"NO"<<endl;
}


View Code

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