Pagini recente » Cod sursa (job #621980) | Cod sursa (job #303865) | Cod sursa (job #365454) | Cod sursa (job #990256) | Cod sursa (job #927600)
Cod sursa(job #927600)
#include <cstdio>
#include <string.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <utility>
using namespace std;
#define Nmax 1005
#define Mmax 10005
vector <int> graf[Nmax];
queue <int> q;
int n, m, flow, r, k;
int c[Nmax][Nmax], f[Nmax][Nmax];
int t[Nmax], A[Mmax], B[Mmax], sursa[Nmax], dest[Nmax], sol[Nmax];
void read(){
int x, y, z;
scanf("%i %i", &n, &m);
for(int i = 1; i <= m; ++i){
scanf("%i %i %i", &x, &y, &z);
graf[x].push_back(y);
graf[y].push_back(x);
A[i] = x;
B[i] = y;
c[x][y] += z;
c[y][x] += z;
}
fclose(stdin);
}
inline int min(int a, int b){
if(a > b) return b;
return a;
}
void dfs(int node, int a[]){
a[node] = 1;
int i, v, size = graf[node].size();
for(i = 0; i < size; ++i){
v = graf[node][i];
if(!a[v] && c[node][v] > f[node][v] && c[v][node] > f[v][node])
dfs(v, a);
}
}
int bfs(){
int u, v;
memset(t, 0, sizeof(t));
q.push(1);
while(!q.empty()){
u = q.front();
q.pop();
if(u == n){
while(!q.empty()) q.pop();
return t[n];
}
for(int i = 0, size = graf[u].size(); i < size; ++i){
v = graf[u][i];
if(t[v] == 0 && c[u][v] != f[u][v]){
t[v] = u;
q.push(v);
}
}
}
return t[n];
}
void solve(){ // algoritmul lui dinic
int v;
while(bfs())
for(int i = 0, size = graf[n].size(); i < size; ++i){
v = graf[n][i];
if(t[v] && c[v][n] != f[v][n]){
r = c[v][n] - f[v][n];
for(int j = v; j != 1; j = t[j])
r = min(r, c[t[j]][j] - f[t[j]][j]);
f[v][n] += r;
f[n][v] -= r;
for(int j = v; j != 1; j = t[j]){
f[t[j]][j] += r;
f[j][t[j]] -= r;
}
flow += r;
}
}
dfs(1,sursa);
dfs(n, dest);
for(int i = 1; i <= m; ++i)
if((sursa[A[i]] && dest[B[i]]) || (dest[A[i]] && sursa[B[i]]))
sol[k++] = i;
}
void print(){
printf("%i\n", k);
for(int i = 0; i < k; ++i) printf("%i\n", sol[i]);
fclose(stdout);
}
int main(){
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
read();
solve();
print();
return 0;
}