Cod sursa(job #1794279)

Utilizator LucianTLucian Trepteanu LucianT Data 1 noiembrie 2016 09:46:29
Problema Traseu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <bits/stdc++.h>
#define maxN 64
#define INF (1<<30)
using namespace std;
bool seen[maxN];
queue<int> Que;
int grad[maxN];
vector<int>v[maxN];
int n,m,i,j,x,y,z,dist[maxN],t[maxN];
int cost[maxN][maxN],cap[maxN][maxN],flow[maxN][maxN];
int nod,addflow,sol,maxflow,source,sink;
bool bellmanford()
{
    for(i=0;i<=n+1;i++)
        dist[i]=INF;
    memset(t,0,sizeof(t));
    memset(seen,false,sizeof(seen));
    Que.push(source);
    dist[source]=0;
    seen[source]=true;
    while(!Que.empty())
    {
        int nod=Que.front();
        Que.pop();
        for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
            if(cap[nod][*it]!=flow[nod][*it] && dist[nod]+cost[nod][*it]<dist[*it])
            {
                dist[*it]=dist[nod]+cost[nod][*it];
                t[*it]=nod;
                if(!seen[*it])
                    seen[*it]=true,
                    Que.push(*it);
            }
        seen[nod]=false;
    }
    if(dist[sink]==INF)
        return false;
    return true;
}
int main()
{
    freopen("traseu.in","r",stdin);
    freopen("traseu.out","w",stdout);
    scanf("%d %d",&n,&m);
    source=0,sink=n+1;
    for(i=1;i<=m;i++)
        scanf("%d %d %d",&x,&y,&z),
        v[x].push_back(y),
        v[y].push_back(x),
        cap[x][y]=INF,
        cost[x][y]=z,cost[y][x]=-z,
        grad[x]++,grad[y]--,
        sol+=z;
    for(i=1;i<=n;i++)
        if(grad[i]<0)
            v[source].push_back(i),
            v[i].push_back(source),
            cap[source][i]=-grad[i];
        else if(grad[i]>0)
            v[sink].push_back(i),
            v[i].push_back(sink),
            cap[i][sink]=grad[i];
    while(bellmanford())
    {
        addflow=INF;
        for(nod=sink;nod!=source;nod=t[nod])
            if(addflow>cap[t[nod]][nod]-flow[t[nod]][nod])
                addflow=cap[t[nod]][nod]-flow[t[nod]][nod];
        for(nod=sink;nod!=source;nod=t[nod])
            flow[t[nod]][nod]+=addflow,
            flow[nod][t[nod]]-=addflow;
        sol+=addflow*dist[sink];
    }
    printf("%d",sol);
    return 0;
}