Pagini recente » Cod sursa (job #2978652) | Cod sursa (job #2172540) | Cod sursa (job #2203) | Cod sursa (job #2973576) | Cod sursa (job #1449707)
#include<stdio.h>
#include<vector>
#include<iostream>
using namespace std;
int nr,sol[10100],e1[10100],e2[10100],flux,x,y,z,M,N,rez,c[1100][1100],f[1100][1100],q[1100],first,last,p[1100];
vector<int> m[1100];
bool viz[1100],viz2[1100];
inline bool bfs(int s, int d) {
first = 0, last = 0;
for(int i=1;i<=N;++i) {
viz[i] = 0;
}
q[last++] = s;
viz[s] = 1;
while(first < last) {
int x = q[first++];
if(x==d) {
continue;
}
for(int i = 0; i < m[x].size(); ++i) {
int y = m[x][i];
if(!viz[y] && f[x][y] < c[x][y]) {
q[last++] = y;
viz[y]=1;
p[y] = x;
}
}
}
return viz[d];
}
void update_flow() {
for(int i=0;i<m[N].size();++i) {
int y = m[N][i];
if(f[y][N] < c[y][N] && viz[y]) {
p[N] = y;
flux = 110000;
int curr = N;
while(p[curr]) {
if(c[p[curr]][curr] - f[p[curr]][curr] < flux) {
flux = c[p[curr]][curr] - f[p[curr]][curr];
}
if(!flux) {
break;
}
curr = p[curr];
}
curr = N;
while(p[curr]) {
f[p[curr]][curr] += flux;
f[curr][p[curr]] -= flux;
curr = p[curr];
}
rez += flux;
}
}
}
int main() {
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1;i<=M;++i) {
scanf("%d%d%d",&x,&y,&z);
m[x].push_back(y);
m[y].push_back(x);
c[x][y] = z;
c[y][x] = z;
e1[i] = x;
e2[i] = y;
}
while(true) {
if(!bfs(1,N)) {
break;
}
update_flow();
}
bfs(N,1);
for(int i=1;i<=N;++i) {
viz2[i] = viz[i];
}
bfs(1,N);
for(int i=1;i<=M;++i) {
x = e1[i], y = e2[i];
if((viz[x] && viz2[y]) || (viz2[x] && viz[y])) {
sol[++nr] = i;
}
}
printf("%d\n",nr);
for(int i=1;i<=nr;++i) {
printf("%d ",sol[i]);
}
return 0;
}