Pagini recente » Cod sursa (job #1046484) | Cod sursa (job #1046485) | Cod sursa (job #1046494) | Cod sursa (job #1530595) | Cod sursa (job #1693227)
#include <cstdio>
#include <vector>
#include <queue>
#define nmax 1001
#include <cstring>
#define inf 0x3f3f3f3f
#include <algorithm>
using namespace std;
int N,M,F[nmax][nmax],cap[nmax][nmax],cd[nmax],pred[nmax];
vector <int> G[nmax],R;
vector <pair<int,int> > T;
bool viz[nmax],source[nmax],dest[nmax];
queue <int> Q;
void BFS2(int s,bool vec[]){
memset(viz,0,sizeof(viz));
viz[s] = 1;
Q.push(s);
int x;
vec[s] = 1;
while(!Q.empty()){
x = Q.front();
Q.pop();
for(vector <int> :: iterator v = G[x].begin();v != G[x].end();++v)
if(viz[*v] == 0){
if(F[x][*v] == cap[x][*v])
vec[x] = 1;
else{
Q.push(*v);
viz[*v] = 1;
}
}
}
}
bool BFS1(){
memset(viz,0,sizeof(viz));
viz[1] = 0;
cd[0] = cd[1] = 1;
for(int i = 1;i <= cd[0];i++){
if(cd[i] != N){
for(vector <int> :: iterator v = G[cd[i]].begin();v != G[cd[i]].end();++v){
if(viz[*v] == 0 && F[cd[i]][*v] < cap[cd[i]][*v]){
viz[*v] = 1;
pred[*v] = cd[i];
cd[++cd[0]] = *v;
}
}
}
}
return viz[N];
}
int main(){
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d %d ",&N,&M);
int x,y,z,i;
for(i = 1;i <= M;i++){
scanf("%d %d %d ",&x,&y,&z);
G[x].push_back(y);
G[y].push_back(x);
cap[x][y] = cap[y][x] = z;
T.push_back(make_pair(x,y));
}
int flow1 = 0,fmin;
while(BFS1()){
for(vector <int> :: iterator v = G[N].begin();v != G[N].end();++v){
if(F[*v][N] == cap[*v][N] || viz[*v] == 0)continue;
pred[N] = *v;
fmin = inf;
for(i = N;i != 1;i = pred[i])
fmin = min(fmin,cap[pred[i]][i] - F[pred[i]][i]);
if(fmin == 0)continue;
for(i = N;i != 1;i = pred[i]){
F[pred[i]][i] += fmin;
F[i][pred[i]] += fmin;
}
flow1 += fmin;
}
}
BFS2(1,source);
BFS2(N,dest);
//for(i = 1;i <= N;i++)printf("%d %d\n",source[i],dest[i]);
for(i = 0;i < T.size();++i){
if((source[T[i].first] == 1 && dest[T[i].second] == 1) || (source[T[i].second] == 1 && dest[T[i].first] == 1))
R.push_back(i+1);
}
printf("%d\n",R.size());
for(vector <int> :: iterator v = R.begin();v != R.end();++v)printf("%d\n",*v);
return 0;
}