Cod sursa(job #1020427)

Utilizator ELHoriaHoria Cretescu ELHoria Data 2 noiembrie 2013 01:12:30
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#include <cstdlib>
 
using namespace std;
 
ifstream fin("critice.in");
ofstream fout("critice.out");
 
const int NMAX = 1005;
int F[NMAX][NMAX], C[NMAX][NMAX], T[NMAX];
int use[NMAX], N,  M;
vector<int> G[NMAX] , ans;
bitset<NMAX> vis;
vector< pair<int,int> > edges;
 
void readData() {
    fin>>N>>M;
    for(int x, y, c, i = 1;i <= M;++i){
        fin>>x>>y>>c;
        G[x].push_back(y);
        G[y].push_back(x);
        edges.push_back(make_pair(x,y));
        C[x][y] = C[y][x] = c;
    }
}
 
bool bfs() {
    queue<int> Q;
    for(int i = 1;i <= N;++i) T[i] = -1 , vis[i] = false;
    for(Q.push(1) , vis[1] = 1;!Q.empty() && !vis[N];) {
        int v = Q.front(); Q.pop();
		if(v == N) continue;
        for(const auto& w : G[v]) {
            if(vis[w] == 0 && C[v][w] > F[v][w]) {
                vis[w] = 1;
                T[w] = v;
                Q.push(w);
            }
		}
    }
    return vis[N];
}
 
void bfR(const int &S,const int &nr){
    queue<int> Q;
    for(Q.push(S) , use[S] = nr;!Q.empty();)  {
        int v = Q.front(); Q.pop();
        for(const auto& w : G[v]) {
            if(!use[w] && C[v][w] > abs(F[v][w])) {
                use[w] = nr;
                Q.push(w);
           }
		}
    }
}
 
void flow() {
    while(bfs()) 
        for(const auto& w : G[N]) {
            if(!vis[w] || C[w][N] == F[w][N]) continue;
			T[N] = w;
            int fmin = int(1e9);
            for(int node = N;node != 1;node = T[node])
                fmin = min(fmin,C[T[node]][node] - F[T[node]][node]);
 
            if(!fmin) continue;
 
            for(int node = N;node != 1;node = T[node])
                F[node][T[node]] -= fmin , F[T[node]][node]+=fmin;
        }
}
 
int main()
{
    readData();
    flow();
    bfR(1,1);
    bfR(N,2);
    for(int i = 0;i < M;++i)
        if(use[edges[i].first] + use[edges[i].second] == 3)
            ans.push_back(i + 1);
 
    fout<<ans.size()<<'\n';
    for(int i = 0;i < (int)ans.size();++i) {
        fout<<ans[i]<<'\n';
	}
    return 0;
}