加个超赞的题解!http://ycool.com/post/zhhrrm6
简直! 我居然会把数据范围搞错!
明明定义全局变量s
,t
又在main()
里面int
了一遍 导致死循环!
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define INF 100000000
using namespace std;
int m,n;
bool b[101][1001];
bool f[1001];
int g[110][110];
int house[1001];
int team[110],head,tail;
int d[110];
int s,t;
bool bfs()
{
head=tail=0;
memset(d,0,sizeof(d));
team[++tail]=s;
d[s]=1;
while(head<tail)
{
int x=team[++head];
for(int i=1;i<=n;i++)
if(d[i]==0&&g[x][i]!=0)
d[i]=d[x]+1,team[++tail]=i;
}
if(d[t]==0) return false;
else return true;
}
int dfs(int x,int mmin)
{
int tmp;
if(x==t) return mmin;
for(int i=1;i<=n;i++)
if(d[i]==d[x]+1&&g[x][i]!=0&&(tmp=dfs(i,min(mmin,g[x][i]))))
{
g[x][i]-=tmp;
g[i][x]+=tmp;
return tmp;
}
return 0;
}
int main()
{
scanf("%d %d",&m,&n);
s=n+1,t=n+2;
for(int i=1;i<=m;i++) scanf("%d",&house[i]);
for(int i=1;i<=n;i++)
{
int tmp;scanf("%d",&tmp);
for(int x,j=1;j<=tmp;j++)
{
scanf("%d",&x);
b[i][x]=true;
if(!f[x])
g[s][i]+=house[x],f[x]=true;
else
for(int k=1;k<i;k++) if(b[k][x]) g[k][i]=INF;
}
scanf("%d",&g[i][t]);
}
n+=2;
int ans=0;
while(bfs()) ans+=dfs(s,INF);
printf("%d",ans);
return 0;
}