题目描述:
qwq。
题目分析:
题目链接:
Ac 代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define inf 0x7fffffff
const int maxm=400*400+10;
int head[maxm],to[maxm<<1],net[maxm<<1],cap[maxm<<1];
int cnt=1;
int n,m,ys[maxm];
inline void addedge(int u,int v,int c)
{
cnt++;
to[cnt]=v,cap[cnt]=c,net[cnt]=head[u],head[u]=cnt;
cnt++;
to[cnt]=u,cap[cnt]=0,net[cnt]=head[v],head[v]=cnt;
}
namespace Maxflow{
int deep[maxm];
std::queue <int> dl;
inline bool BFS(int s,int t)
{
memset(deep,-1,sizeof(deep));
deep[s]=0,dl.push(s);
while(!dl.empty())
{
int now=dl.front();
dl.pop();
for(int i=head[now];i;i=net[i])
if(cap[i]&&deep[to[i]]==-1)
deep[to[i]]=deep[now]+1,dl.push(to[i]);
}
return deep[t]!=-1;
}
int DFS(int now,int flow,int t)
{
if(now==t) return flow;
int used=0,w;
for(int i=head[now];i;i=net[i])
if(cap[i]&&deep[to[i]]==deep[now]+1)
{
w=DFS(to[i],std::min(cap[i],flow-used),t);
used+=w;
cap[i]-=w,cap[i^1]+=w;
if(flow==used) return flow;
}
if(!used) deep[now]=-1;
return used;
}
inline int Dinic(int s,int t)
{
int maxflow=0;
while(BFS(s,t)) maxflow+=DFS(s,inf,t);
return maxflow;
}
}
int main()
{
scanf("%d%d",&n,&m);
int s=0,t=n+10;
for(int i=1;i<=n;i++)
{
scanf("%d",&ys[i]);
if(ys[i]) addedge(s,i,1);
else addedge(i,t,1);
}
for(int i=1,u,v;i<=m;i++)
{
scanf("%d%d",&u,&v);
if(ys[u]!=ys[v]) addedge(u,v,1),addedge(v,u,1);
}
printf("%d\n",Maxflow::Dinic(s,t));
return 0;
}