Cod sursa(job #1519412)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 7 noiembrie 2015 12:24:22
Problema Cuplaj maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#define DIM 105
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>
#include <queue>

using namespace std;

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

int N, K, flux;
vector <int> v[DIM];
queue <int> Q;
int F[DIM][DIM],C[DIM][DIM];
int T[DIM];
bitset <DIM> U;
vector <int> Sol;
pair <int,int> z[5005];

int bfs(){
    U.reset();
    U[101]=1;
    Q.push(101);
    while(!Q.empty()){
        int node = Q.front();
        Q.pop();
        for(int i=0;i<v[node].size();i++){
            int vec = v[node][i];
            if(!U[vec] && C[node][vec] > F[node][vec]){
                T[vec]=node;
                U[vec]=1;
                Q.push(vec);
            }
        }
    }
    return U[100];
}

int main(){
    fin >> N >> K;

    for(int i=1;i<=N;i++){
        int x,y;
        fin >> x >> y;
        v[x].push_back(y);
        v[y].push_back(x);
        C[x][y]++;
        z[i] = make_pair(x,y);
    }
    C[101][0]=K;
    v[101].push_back(0);
    v[0].push_back(101);
    while(bfs()){
        int minim = 0x3f3f3f3f;
        int u = 100;
        while(u!=101){
            if(minim > C[T[u]][u] - F[T[u]][u])
                minim = C[T[u]][u] - F[T[u]][u];
            u=T[u];
        }
        u = 100;
        while(u!=101){
            F[T[u]][u] += minim;
            F[u][T[u]] -= minim;
            u=T[u];
        }
    }

    for(int i=1;i<=N;i++){
        if(F[z[i].first][z[i].second]){
            Sol.push_back(i);
            F[z[i].first][z[i].second]--;
        }
    }
    fout << Sol.size() << "\n";
    for(int i=0;i<Sol.size();i++)
        fout << Sol[i] << " ";
}