Cod sursa(job #1723185)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 29 iunie 2016 23:01:39
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include<cstdio>
#include<vector>
#include<cstring>
#define MAXN 55
#define MAXNODES 5001
#define INF 100
using namespace std;
vector<pair<int,int> > edges[MAXN];
vector<int> g[MAXNODES+5];
int n,m,source=0,sink=MAXNODES,capital=1;
int seen[MAXNODES+5],dad[MAXNODES+5],Queue[MAXNODES+5];
char capacity[MAXNODES+5][MAXNODES+5];
void AddEdge(int a,int b,int c){
    g[a].push_back(b);
    g[b].push_back(a);
    capacity[a][b]=c;
}
int minimum(int a,int b){
    if(a<b)
        return a;
    return b;
}
bool BFS(){
    int left=1,right=1,node,i;
    memset(seen,0,sizeof(seen));
    Queue[left]=source;
    seen[source]=1;
    while(left<=right){
        node=Queue[left];
        left++;
        if(node==sink)
            continue;
        for(i=0;i<g[node].size();i++)
            if(seen[g[node][i]]==0&&capacity[node][g[node][i]]>0){
                seen[g[node][i]]=1;
                dad[g[node][i]]=node;
                right++;
                Queue[right]=g[node][i];
            }
    }
    if(seen[sink]==1)
        return true;
    return false;
}
int MaximumFlow(){
    int i,answer=0,add,node;
    while(BFS()==true)
        for(i=0;i<g[sink].size();i++)
            if(seen[g[sink][i]]==1&&capacity[g[sink][i]][sink]>0){
                dad[sink]=g[sink][i];
                add=INF;
                for(node=sink;node!=source;node=dad[node])
                    add=minimum(add,capacity[dad[node]][node]);
                for(node=sink;node!=source;node=dad[node]){
                    capacity[dad[node]][node]-=add;
                    capacity[node][dad[node]]+=add;
                }
                answer+=add;
            }
    return answer;
}
int main(){
    freopen("algola.in","r",stdin);
    freopen("algola.out","w",stdout);
    int i,j,a,b,c,citizens,sum=0.,currentFlow,days=0;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++){
        scanf("%d",&citizens);
        sum+=citizens;
        AddEdge(source,i,citizens);
    }
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&a,&b,&c);
        edges[a].push_back(make_pair(b,c));
        edges[b].push_back(make_pair(a,c));
    }
    AddEdge(capital,sink,INF);
    currentFlow=MaximumFlow();
    while(currentFlow<sum){
        days++;
        for(i=1;i<=n;i++){
            AddEdge((days-1)*n+i,days*n+i,INF);
            for(j=0;j<edges[i].size();j++)
                AddEdge((days-1)*n+i,days*n+edges[i][j].first,edges[i][j].second);
        }
        AddEdge(days*n+1,sink,INF);
        currentFlow+=MaximumFlow();
    }
    printf("%d",days);
    return 0;
}