Cod sursa(job #1131458)

Utilizator Eugen_VlasieFMI Vlasie Eugen Eugen_Vlasie Data 28 februarie 2014 20:16:22
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
ifstream f("cmcm.in");
ofstream g("cmcm.out");
vector<int> a[610];
queue<int> Q;
//priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
int j,pred[610],viz[610],rez[610][610],dist[610],fl[610][610],cost[610][610],muc[610][610],m,e,i,n,x,y,c;
int bellmanford()
{
    for(i=2;i<=n+m+2;i++)
        dist[i]=2000000000;
    memset(viz,0,sizeof(viz));
    memset(pred,0,sizeof(pred));
    Q.push(1);
    while(!Q.empty())
    {
        x=Q.front();
        Q.pop();
        viz[x]=0;
        for(vector<int>::iterator it=a[x].begin();it!=a[x].end();it++)
        {
            if(fl[x][*it]&&dist[x]+cost[x][*it]<dist[*it])
            {
                if(!viz[*it])
                {
                    Q.push(*it);
                    viz[*it]++;
                }
                pred[*it]=x;
                dist[*it]=cost[x][*it]+dist[x];
            }
        }
    }
    return pred[n+m+2];
}

int main()
{
    f>>n>>m>>e;
    for(i=1;i<=e;i++)
    {
        f>>x>>y>>c;
        a[x+1].push_back(y+n+1);
        a[y+n+1].push_back(x+1);
        fl[x+1][y+n+1]=1;
        cost[x+1][y+n+1]=c;
        cost[y+n+1][x+1]=-c;
        muc[x+1][y+n+1]=i;
    }
    for(i=2;i<=n+1;i++)
    {
        a[1].push_back(i);
        a[i].push_back(1);
        fl[1][i]=1;
    }
    for(i=n+2;i<=n+m+1;i++)
    {
        a[n+m+2].push_back(i);
        a[i].push_back(n+m+2);
        fl[i][n+m+2]=1;
    }
    y=0;
    while(bellmanford())
    {
        x=n+m+2;
        while(pred[x])
        {
            fl[pred[x]][x]--;
            fl[x][pred[x]]++;
            y+=cost[pred[x]][x];
            rez[pred[x]][x]++;
            rez[x][pred[x]]--;
            x=pred[x];
        }
    }
    x=0;
    for(i=2;i<=n+1;i++)
    {
        for(j=n+2;j<=n+m+1;j++)
        {
            if(rez[i][j]==1)
            {
                x++;
                break;
            }
        }
    }
    g<<x<<" ";
    g<<y<<'\n';
    for(i=2;i<=n+1;i++)
    {
        for(j=n+2;j<=n+m+1;j++)
        {
            if(rez[i][j]==1)
            {
                g<<muc[i][j]<<" ";
                break;
            }
        }
    }
    g<<'\n';
    return 0;
}