Cod sursa(job #1026828)

Utilizator mihaiSimuSimu Mihai mihaiSimu Data 12 noiembrie 2013 01:16:05
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <bitset>
#define MAXN 1003
#define INF 100000
using namespace std;

int n,m,s,t,f;
int parent[MAXN],a[MAXN][MAXN];
vector<int> G[MAXN];
vector<int> indexG[MAXN];

int viz[MAXN];

void augment_path(int u,int max_edge){
    if(u==s) f= max_edge;
    else{
        augment_path(parent[u], min(max_edge,a[parent[u]][u]));
        a[parent[u]][u]-=f;
        a[u][parent[u]]+=f;
    }
}


void DFS1(int u) {
    viz[u] = 1;
    for(int i=0;i<G[u].size();i++) {
        if(a[u][G[u][i]]>0 && !viz[G[u][i]]) {
            DFS1(G[u][i]);
        }
    }
}

void DFS2(int u) {
    viz[u] = 2;
    for(int i=0;i<G[u].size();i++) {
        if(a[G[u][i]][u]>0 && !viz[G[u][i]]) {
            DFS2(G[u][i]);
        }
    }
}

int main(){
    int x,y,c;
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    cin>>n>>m;
    s=1;t=n;
    for(int i=0;i<m;i++) {
        cin>>x>>y>>c;
        a[x][y] = c;
        a[y][x] = c;
        G[x].push_back(y);
        G[y].push_back(x);
        indexG[x].push_back(i+1);
        indexG[y].push_back(i+1);
    }
    
    while(true) {
        queue<int> q;q.push(s);
        bitset<MAXN> viz;
        viz.reset();
        viz[s] = true;
        
        while(!q.empty()) {
            int u = q.front();q.pop();
            if(u==t) break;
            for(int i=0;i<G[u].size();i++) {
                int v = G[u][i];
                if(!viz[v] && a[u][v]>0) {
                    viz[v] = true;
                    parent[v] = u;
                    q.push(v);
                }
            }
        }
        
        if(!viz[t]) break;
        
        for(int i=0;i<G[t].size();i++) {
            int v= G[t][i];
            if(viz[v] && a[v][t]>0) {
                parent[t] = v;
                augment_path(t,INF);
            }
        }
        
    }
    DFS1(s);
    DFS2(t);
    vector<int> ans;
    for(int i=1;i<=n;i++){
        for(int j=0;j<G[i].size();j++) {
            int v = G[i][j];
            if(a[i][v] == 0 && viz[i] && viz [v] && viz[i]!=viz[v]) {
                ans.push_back(indexG[i][j]);
            }
        }
    }
    sort(ans.begin(),ans.end());
    cout<<ans.size()<<"\n";
    for(int i=0;i<ans.size();i++) {
        cout<<ans[i]<<"\n";
    }
    
    return 0;
}