Cod sursa(job #1709427)

Utilizator twistedstoryUAIC Twisted Story twistedstory Data 28 mai 2016 12:11:45
Problema Tribut Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.7 kb
#include<bits/stdc++.h>
using namespace std;

typedef struct lnod {
    int nod;
    lnod *next;
}*nod;

const int INF=1e9+69*69;

int i,n,m,x,y,z,rs,q[305],a[305][305],qt,nr,qh,tata[305],t;
bool viz[305];
nod lda[305];

void add(int x,nod &y) {
    nod p=new lnod;
    p->nod=x;
    p->next=y;
    y=p;
}

void Update() {
    int addflow=INF;

    for(x=n+m+1;x!=0;x=tata[x]) addflow=min(addflow,a[tata[x]][x]);

    rs+=addflow;

    for(x=n+m+1;x!=0;x=tata[x]) a[tata[x]][x]-=addflow,a[x][tata[x]]=+addflow;
}

bool bfs() {
     bool u=0;

     memset(viz,0,sizeof(viz));

     viz[0]=1; q[1]=0; tata[0]=0;
     for(qh=qt=1;qh<=qt;++qh)
      for(nod p=lda[q[qh]];p;p=p->next)
      if(a[q[qh]][p->nod]>0 && !viz[p->nod])
      {
        viz[p->nod]=1; tata[p->nod]=q[qh]; q[++qt]=p->nod;
        if(p->nod==n+m+1) Update(),viz[n+m+1]=0,--qt,u=1;
      }

     return u;
}

int main()
{
  ifstream cin("tribut.in");
  ofstream cout("tribut.out");

  ios_base::sync_with_stdio(0); cin.tie(0);

  for(cin>>t;t;--t)
  {
    memset(a,0,sizeof(a));
    memset(lda,0,sizeof(lda));

    cin>>n>>m; rs=0;

    for(i=1;i<=n;++i)
    {
      cin>>x;
      add(i,lda[0]); a[0][i]=x;
      add(0,lda[i]);
    }

    for(i=1;i<=m;++i)
    {
      cin>>z>>y;

      while(z--)
      {
        cin>>x;
        add(n+i,lda[x]); a[x][n+i]=y;
        add(x,lda[n+i]);
        viz[x]=1;
      }

      add(n+m+1,lda[n+i]); a[n+i][n+m+1]=INF;
      add(n+i,lda[n+m+1]);
    }

    for(i=1;i<=n;++i)
    if(!viz[i])
    {
      add(n+m+1,lda[i]); a[i][n+m+1]=a[0][i];
      add(i,lda[n+m+1]);
    }

    while(bfs());

    cout<<rs<<'\n';
  }

 return 0;
}