这尼玛都能过,太高兴了,意料之外
图建得惨不忍赌啊
#include<iostream>
#include<stack>
#include<cstring>
#include<queue>
using namespace std;
const int inf = 0x7f7f7f7f;
int a[1100];
int p[405][405];
int pre[405];
int maxflow=0;
queue<int>q;
int sp,sf;
int vis[1100];
int flow[405];
int tmp[405];
int mm;
void bfs()
{
while(q.size())
q.pop();
q.push(sp);
memset(vis,0,sizeof(vis));
memset(pre,-1,sizeof(pre));
int u,v;
vis[sp]=1;
flow[sp]=inf;
while(q.size()&&vis[sf]==0)
{
u=q.front();
q.pop();
for(v=0;v<=sf;v++)
{
if(!vis[v]&&p[u][v])
{
flow[v]=min(flow[u],p[u][v]);
vis[v]=1;
pre[v]=u;
q.push(v);
}
}
}
return ;
}
void max_flow()
{
while(1)
{
bfs();
if(vis[sf]==0)
{
break;
}
int s=sf;
while(pre[s]!=-1)
{
p[pre[s]][s]-=flow[sf];
p[s][pre[s]]+=flow[sf];
s=pre[s];
}
maxflow+=flow[sf];
}
return ;
}
stack<int>temp;
int main()
{
int m,n;
cin>>m>>n;
int i,j;
memset(vis,0,sizeof(vis));
memset(p,0,sizeof(p));
for(i=1;i<=m;i++)
cin>>a[i];
int x,y;
sp=0;
sf=400;
int sum1,sum2;
mm=1;
int k;
for(i=1;i<=n;i++)
{
cin>>x;
for(j=1;j<=x;j++)
{
cin>>tmp[j];
}
cin>>y;
k=0;
sum2=0;
for(j=1;j<=x;j++)
{
if(vis[tmp[j]])
{
k=vis[tmp[j]];
temp.push(k); //一开始没有压栈保存,以为只保存一个就行了,然后WA.
}
else
{
sum2+=a[tmp[j]];
vis[tmp[j]]=mm+1;
}
}
if(sum2)
{
p[sp][mm]=inf;
p[mm][mm+1]=sum2;
mm++;
}
if(temp.size())
{
while(temp.size())
{
p[temp.top()][mm]=inf;
temp.pop();
}
}
p[mm++][sf]=y;
}
max_flow();
cout<<maxflow<<endl;
}