poj 1149
网络流,重在建图(注意重边)。
代码:
#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
int n;
int c[105][105],pre[105],f[105][105];
int d[105],flow;
int v[105];
typedef struct e{
int data;
e *next;
}e;
e edge[105];
int build(){
int i,j,k;
queue<int> q;
q.push(1);
memset(d,0,sizeof(d));
d[1]=1;
while(!q.empty())
{
i=q.front();
q.pop();
e *p=edge[i].next;
while(p)
{
j=p->data;
if(d[j]==0&&c[i][j]>f[i][j])
{
d[j]=d[i]+1;
if(j==n) return 1;
q.push(j);
}
p=p->next;
}
}
return 0;
}
int find(int m,int minw){
int i,j,k;
if(m==n) return minw;
v[m]=1;
e *p=edge[m].next;
while(p)
{
i=p->data;
if(c[m][i]>f[m][i]&&d[i]==d[m]+1&&v[i]==0)
{
j=find(i,min(minw,c[m][i]-f[m][i]));
if(j)
{
f[m][i]+=j;
f[i][m]=-1*f[m][i];
return j;
}
}
p=p->next;
}
return 0;
}
int solve(){
int i,j,k;
flow=0;
memset(f,0,sizeof(f));
while(build())
while(1){
memset(v,0,sizeof(v));
i=10000000;
k=find(1,i);
flow+=k;
if(k==0) break;
}
return flow;
}
int value[1001];
int map[1001][101];
int cnt[1001];
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t,m;
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>value[i];
for(i=1;i<=m;i++)
{
cin>>k;
for(j=1;j<=k;j++)
{
cin>>s;
cnt[s]++;
map[s][cnt[s]]=i;
if(cnt[s]!=1)
c[map[s][cnt[s]-1]+1][i+1]=1000000;
else
c[map[s][cnt[s]-1]+1][i+1]+=value[s];
e *p=new e;
p->data=i+1;
p->next=edge[map[s][cnt[s]-1]+1].next;
edge[map[s][cnt[s]-1]+1].next=p;
e *q=new e;
q->data=map[s][cnt[s]-1]+1;
q->next=edge[i+1].next;
edge[i+1].next=q;
}
cin>>k;
c[i+1][m+2]=k;
e *p=new e;
p->data=m+2;
p->next=edge[i+1].next;
edge[i+1].next=p;
e *q=new e;
q->data=i+1;
q->next=edge[m+2].next;
edge[m+2].next=q;
}
n=m+2;
solve();
cout<<flow<<endl;
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号