Cod sursa(job #1709970)

Utilizator UBB_RANDOMUBB Muntea Zsisku Adam UBB_RANDOM Data 28 mai 2016 14:38:21
Problema Tribut Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.8 kb
#include <fstream>
#include <string.h>
#include <queue>
#include<iostream>
using namespace std;

ifstream f("tribut.in");
ofstream q("tribut.out");

#define MAX 1000000000

int ecart[400][400];
int visited[400];


bool bfs(int s, int d, int ecart[400][400]){

    queue <int> coada;
    coada.push(s);
    for (int i = 0; i<=d; i++) visited[i] = -2;
    visited[s] = -1;
    int prim;

    while (!coada.empty()){
        prim = coada.front();
        coada.pop();
        for (int i = 0; i<=d; i++){
            if (visited[i] == -2 && ecart[prim][i] > 0){
                visited[i] = prim;
                coada.push(i);
            }
        }
    }


    return (visited[d] != -2);

}

int fordFulkerson(int s, int d, int mat[400][400]){

    for (int i = 0; i <= d; i++){
        for (int j = 0; j<=d; j++){
            ecart[i][j] = mat[i][j];
        }
    }

    int maxFlow = 0,u, flow;

    while (bfs(s,d,ecart)){
        flow = MAX;
        for(u = d; u!=s; u=visited[u]){
            if (ecart[visited[u]][u] < flow){
                flow = ecart[visited[u]][u];
            }
        }
        maxFlow+=flow;
        for(u = d; u!=s; u=visited[u]){
            ecart[visited[u]][u]-=flow;
            ecart[u][visited[u]]+=flow;
        }

    }
    return maxFlow;
}



int main()
{
    int mat[400][400];
    int t,n,m,unr, nod;
    f>>t;
    for(;t>0;t--){
        f>>n>>m;
        memset(mat,0,400*400*sizeof(int));
        for (int i = 1; i<=n; i++) f>>mat[0][i];
        for (int i = 1; i<=m; i++){
            f>>unr>>mat[n+i][n+m+1];
            for(int j = 1; j<=unr; j++){
                f>>nod;
                mat[nod][n+i] = MAX;
            }
        }
        q<<fordFulkerson(0,n+m+1,mat)<<"\n";
    }




    return 0;
}