第三次发了 。
已经交了一页了 。
#include <iostream>
#include <cstring>
#include <queue>
#define int long long
using namespace std;
int n,m,s,t=10000;
struct edge
{
int to,next,dis;
}e[1000005];
int cnt=1,head[1000005];
void add(int x,int y,int z)
{
cnt++;
e[cnt].to=y;
e[cnt].dis=z;
e[cnt].next=head[x];
head[x]=cnt;
}
int vis[1000005];
int d[1000005];
int bfs()
{
queue<int> q;
q.push(s);
d[s]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(e[i].dis&&!d[v])
{
d[v]=d[x]+1;
if(v==t)return 1;
q.push(v);
}
}
}
return 0;
}
int dfs(int x,int flow)
{
if(x==t)return flow;
int ans=0;
for(int i=head[x];i&&flow;i=e[i].next)
{
int v=e[i].to;
if(e[i].dis==0||d[v]!=d[x]+1)continue;
int res=0;
res=dfs(v,min(flow,e[i].dis));
if(res==0)
{
d[v]=2e14;
}
e[i].dis-=res;
e[i^1].dis+=res;
ans+=res;
flow-=res;
}
return ans;
}
signed main()
{
int i,j,k;
cin>>n>>m;
for(i=1;i<=m;i++)
{
int x;
cin>>x;
if(x==1)add(s,i,1),add(i,s,0);
else add(i,t,1),add(t,i,0);
}
for(i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
add(x,y,1);
add(y,x,1);
}
int ans=0,res=0;
while(bfs())
{
ans+=dfs(s,2e14);
memset(d,0,sizeof(d));
}
cout<<ans;
return 0;
}