RT(如图)
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define fr(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
#define dbout cerr<<"[DeBug]:"
#define mem(x,y) memset(x,y,sizeof(x))
inline int read()
{
int x(0),f(1);char c=getchar();
while(c>'9'||c<'0')f=c=='-'?-1:1,c=getchar();
while(c>='0'&&c<='9')x=x*10+c-48,c=getchar();
return f*x;
}
struct Edge
{
int u,v,f,c;
Edge(int U,int V,int F,int C){u=U,v=V,f=F,c=C;}
};
const int INF=0x3f3f3f3f,N=50010,M=300010;
int head[N],to[M],edge[M],nxt[M],tot,d[N],now[M];
int n,m,s,t;
queue<int>q;
void add(int x,int y,int z)
{
to[++tot]=y,edge[tot]=z,nxt[tot]=head[x],head[x]=tot;
to[++tot]=x,edge[tot]=0,nxt[tot]=head[y],head[y]=tot;
}
bool bfs()
{
memset(d,0,sizeof(d));while(!q.empty())q.pop();
q.push(s);d[s]=1;now[s]=head[s];
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=head[x];i;i=nxt[i])
if(edge[i]&&!d[to[i]])
{
int y=to[i];
q.push(y);
now[y]=head[y];
d[y]=d[x]+1;
if(y==t)return true;
}
}
return false;
}
int dfs(int x,int f)
{
if(x==t)return f;
int lft=f,i,k;
for(i=now[x];i&&lft;i=nxt[i])
if(edge[i]&&d[to[i]]==d[x]+1)
{
int y=to[i];
k=dfs(y,min(edge[i],lft));
if(!k)d[y]=0;
edge[i]-=k;
edge[i^1]+=k;
lft-=k;
}
now[x]=i;
return f-lft;
}
bool vis[N][N];
int main()
{
// fr();
n=read(),m=read();s=n+m+1;t=n+m+2;
tot=1;
for(int i=1;i<=m;i++)
add(s,i,read());
for(int i=1;i<=n;i++)
{
for(int j=1;j<=read();j++)
vis[i][read()]=1;
add(m+i,t,read());
}
for(int i=1;i<=m;i++)
{
int now=i;
for(int j=1;j<=n;j++)
if(vis[j][i])
{
add(now,m+j,INF);
now=m+j;
}
}
int f=0,ans=0;
while(bfs())
while(f=dfs(s,INF))ans+=f;
printf("%lld",ans);
return 0;
}