Cod sursa(job #2759405)

Utilizator GligarEsterabadeyan Hadi Gligar Data 17 iunie 2021 16:12:49
Problema Cuplaj maxim de cost minim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.21 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream fin("cmcm.in");
ofstream fout("cmcm.out");

const int nmax=300, inf=(1<<30)-1;

struct str{
    int x,y;
    str(int x, int y);
};

str::str(int x,int y){
    this->x=x;
    this->y=y;
}

struct cmp{
    bool operator()(str x, str y){
        return x.y>y.y;
    }
};

priority_queue <str, vector<str>, cmp> h;

int f[2*nmax+2][2*nmax+2], c[2*nmax+2][2*nmax+2], d[2*nmax+2], t[2*nmax+2], v[nmax+1], mc[2*nmax+2][2];

vector <int> g[2*nmax+2];

queue <int> q;

void dfs(int x, int y){
    v[x]=y;
    for(int i=0;i<int(g[x].size());i++){
        int xn=g[x][i];
        if(v[xn]==0&&f[x][xn]>0&&f[xn][x]>0){
            dfs(xn, y);
        }
    }
}

int main(){
    int n,m,e;
    fin>>n>>m>>e;
    for(int i=1;i<=e;i++){
        int x,y,z;
        fin>>x>>y>>z;
        y=y+n;
        f[x][y]=1;
        c[x][y]=z;
        c[y][x]=-z;
        mc[i][0]=x;
        mc[i][1]=y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for(int i=1;i<=n;i++){
        f[0][i]=1;
        g[0].push_back(i);
        g[i].push_back(0);
    }
    int mn=m+n;
    for(int i=n+1;i<=mn;i++){
        f[i][mn+1]=1;
        g[i].push_back(mn+1);
        g[mn+1].push_back(i);
    }

    for(int i=0;i<=mn+1;i++){
        d[i]=inf;
    }

    d[0]=0;
    q.push(0);
    while(q.empty()==0){
        int x=q.front();
        q.pop();
        for(int i=0;i<int(g[x].size());i++){
            int xn=g[x][i];
            if(f[x][xn]>0&&d[xn]>d[x]+c[x][xn]){
                d[xn]=d[x]+c[x][xn];
                q.push(xn);
            }
        }
    }

    int dif=0,sol=0,solf=0;
    while(d[mn+1]!=inf){
        for(int x=0;x<=mn+1;x++){
            for(int i=0;i<int(g[x].size());i++){
                int xn=g[x][i];
                if(d[x]!=inf&&d[xn]!=inf){
                    c[x][xn]=c[x][xn]+d[x]-d[xn];
                }
            }
        }
        dif+=d[mn+1];

        for(int i=0;i<=mn+1;i++){
            d[i]=inf;
        }
        d[0]=0;
        h.push(str(0,0));
        while(h.empty()==0){
            int x=h.top().x;
            int y=h.top().y;
            h.pop();
            if(y==d[x]){
                for(int i=0;i<int(g[x].size());i++){
                    int xn=g[x][i];
                    if(f[x][xn]>0&&d[xn]>d[x]+c[x][xn]){
                        t[xn]=x;
                        d[xn]=d[x]+c[x][xn];
                        h.push(str(xn,d[xn]));
                    }
                }
            }
        }

        if(d[mn+1]!=inf){
            int mini=inf;
            for(int i=mn+1;i!=0;i=t[i]){
                if(mini>f[t[i]][i]){
                    mini=f[t[i]][i];
                }
            }
            for(int i=mn+1;i!=0;i=t[i]){
                f[t[i]][i]-=mini;
                f[i][t[i]]+=mini;
            }
            sol+=(d[mn+1]+dif)*mini;
            solf+=mini;
        }
    }

    dfs(0,1);
    dfs(mn+1,2);
    fout<<solf<<" "<<sol<<"\n";
    for(int i=1;i<=e;i++){
        int x=mc[i][0], y=mc[i][1];
        if(f[x][y]==0){
            fout<<i<<" ";
        }
    }
    return 0;
}