Cod sursa(job #2395859)

Utilizator PredaBossPreda Andrei PredaBoss Data 2 aprilie 2019 22:22:11
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.4 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
int n,m,e,x,y,val,inc,sf;
int edge[605][605];
int c[605][605];
int f[605][605];
int father[605],dist[605];
bool used[605];
vector<pair<int,int> >nod[605];
int ford()
{
    for(int i=inc;i<=sf;i++)
    {
        father[i]=0;
        dist[i]=INT_MAX;
        used[i]=false;
    }
    queue<int>q;
    dist[inc]=0;
    used[inc]=true;
    q.push(inc);
    while(!q.empty())
    {
        int pos=q.front();
        q.pop();
        for(int i=0;i<nod[pos].size();i++)
            if(c[pos][nod[pos][i].first]>f[pos][nod[pos][i].first] && dist[nod[pos][i].first]>dist[pos]+nod[pos][i].second)
            {
                dist[nod[pos][i].first]=dist[pos]+nod[pos][i].second;
                father[nod[pos][i].first]=pos;
                if(!used[nod[pos][i].first])
                {
                    used[nod[pos][i].first]=true;
                    q.push(nod[pos][i].first);
                }
            }
        used[pos]=false;
    }
    if(dist[sf]==INT_MAX)
        return 0;
    int flux=INT_MAX;
    for(int i=sf;i!=1;i=father[i])
        flux=min(flux,c[father[i]][i]-f[father[i]][i]);
    for(int i=sf;i!=1;i=father[i])
    {
        f[father[i]][i]+=flux;
        f[i][father[i]]-=flux;
    }
    return flux*dist[sf];
}
int main()
{
    fin>>n>>m>>e;
    for(int i=1;i<=e;i++)
    {
        fin>>x>>y>>val;
        x++;
        y+=n+1;
        nod[x].push_back({y,val});
        nod[y].push_back({x,-val});
        edge[x][y]=i;
        c[x][y]=1;
    }
    inc=1;
    sf=n+m+2;
    for(int i=2;i<=n+1;i++)
    {
        nod[inc].push_back({i,0});
        nod[i].push_back({inc,0});
        c[inc][i]=1;
    }
    for(int i=n+2;i<sf;i++)
    {
        nod[sf].push_back({i,0});
        nod[i].push_back({sf,0});
        c[i][sf]=1;
    }
    int hm=1;
    int ans=0;
    while(hm)
    {
        hm=ford();
        ans+=hm;
    }
    hm=0;
    for(int i=2;i<=n+1;i++)
        for(int j=n+2;j<sf;j++)
            if(c[i][j] && f[i][j])
            {
                hm++;
                break;
            }
    fout<<hm<<" "<<ans<<"\n";
    for(int i=2;i<=n+1;i++)
        for(int j=n+2;j<sf;j++)
            if(c[i][j] && f[i][j])
            {
                fout<<edge[i][j]<<" ";
                break;
            }
    return 0;
}