Cod sursa(job #2111601)

Utilizator patcasrarespatcas rares danut patcasrares Data 22 ianuarie 2018 13:53:31
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include<fstream>
#include<queue>
#define DN 605
#define pb push_back
#define x first
#define y second
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
int dist[DN],n,m,e,p,qu,f[DN][DN],cap[DN][DN],cost,dest,nod,inq[DN],pr[DN],mi,rez;
typedef pair<int,int> pii;
int a[DN][DN],nr;
vector<int>k;
vector<pii >v[DN];
queue<int>q;
int bf()
{
    for(int i=2;i<=dest;i++)
        dist[i]=(1<<30);
    q.push(1);
    inq[1]=1;
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        inq[nod]=0;
        for(auto i:v[nod])
            if(f[nod][i.x]<cap[nod][i.x])
                if(dist[nod]+i.y<dist[i.x])
                {
                    dist[i.x]=dist[nod]+i.y;
                    pr[i.x]=nod;
                    if(inq[i.x]==0)
                        q.push(i.x);
                    inq[i.x]=1;
                }
    }
    if(dist[dest]==(1<<30))
        return 0;
    nod=dest;
    //fout<<dist[dest]<<' '<<pr[dest]<<' '<<pr[pr[dest]]<<' '<<pr[pr[pr[dest]]]<<'\n';
    mi=(1<<28);
    while(nod!=1)
    {
        mi=min(mi,cap[pr[nod]][nod]-f[pr[nod]][nod]);
        nod=pr[nod];
    }
    rez+=dist[dest]*mi;
    nod=dest;
    while(nod!=1)
    {
        mi=min(mi,cap[pr[nod]][nod]-f[pr[nod]][nod]);
        f[pr[nod]][nod]+=mi;
        f[nod][pr[nod]]-=mi;
        nod=pr[nod];
    }
    return 1;
}
int main()
{
    fin>>n>>m>>e;
    for(int i=1;i<=e;i++)
    {
        fin>>p>>qu>>cost;
        p++;
        qu+=n+1;
        a[p][qu]=i;
        v[p].pb({qu,cost});
        v[qu].pb({p,-cost});
        cap[p][qu]=1;
    }
    for(int i=2;i<=n+1;i++)
    {
        cap[1][i]=1;
        v[1].pb({i,0});
        v[i].pb({1,0});
    }
    for(int i=n+2;i<=n+m+1;i++)
    {
        cap[i][n+m+2]=1;
        v[i].pb({n+m+2,0});
        v[n+m+2].pb({i,0});
    }
    dest=n+m+2;
    while(bf());
    for(int i=2;i<=n+1;i++)
        for(int j=n+2;j<dest;j++)
            if(f[i][j]&&cap[i][j])
            {
                nr++;
                k.pb(a[i][j]);
            }
    fout<<nr<<' '<<rez<<'\n';
    for(auto i:k)
        fout<<i<<' ';
}