一个晚上的结果,网络流的建图就是不好玩呀,以后要多练,主要是建好图~~~
代码如下:
#include<iostream>
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int nMax=200;
const int mMax=1005;
const int inf=99999999;
int n,m,ans;
int map[nMax][nMax];
int que[nMax],pre[nMax];
bool vis[nMax];
bool bfs()
{
int head=0,tail=1;
memset(vis,0,sizeof(vis));
que[0]=0;
vis[0]=true;
while(tail>head)
{
int u=que[head++];
for(int i=0;i<=n;i++)
if(!vis[i] && map[u][i])
{
pre[i]=u;
if(i==n) return true;
que[tail++]=i;
vis[i]=true;
}
}
return false;
}
void end()
{
int i,sum=inf;
for(i=n;i!=0;i=pre[i])
sum=min(sum,map[pre[i]][i]);
for(i=n;i!=0;i=pre[i])
{
map[pre[i]][i]-=sum;
map[i][pre[i]]+=sum;
}
ans+=sum;
}
int main()
{
int i,k,cnt,pigNum[mMax];
cin>>m>>n;
for(i=1;i<=m;i++)
cin>>pigNum[i];
for(i=1;i<=n;i++)
{
cin>>cnt;
while(cnt--)
{
cin>>k;
if(pre[k]==0)
map[0][i]+=pigNum[k];
else
map[pre[k]][i]=inf;
pre[k]=i;
}
cin>>map[i][n+1];
}
n++;
ans=0;
while(bfs()) end();
cout<<ans<<endl;
return 0;
}