Pagini recente » Cod sursa (job #1026080) | Cod sursa (job #1262278) | Cod sursa (job #1231227) | Cod sursa (job #1263621) | Cod sursa (job #1693781)
#include <cstdio>
#include <vector>
#define nmax 1001
#include <cstring>
#define inf 0x3f3f3f3f
#include <algorithm>
using namespace std;
struct tripl{
int x,y,nr;
};
inline tripl make_tripl(int x,int y,int i){
tripl aux;
aux.x = x;
aux.y = y;
aux.nr = i;
return aux;
}
int N,M,cap[nmax][nmax],F[nmax][nmax],cd[nmax],pred[nmax];
vector <tripl> T;
vector <int> R;
bool viz[nmax],source[nmax],dest[nmax];
bool BFS1(){
memset(viz,0,sizeof(viz));
viz[1] = 1;
cd[0] = cd[1] = 1;
for(int i = 1;i <= cd[0];i++){
if(cd[i] == N)continue;
for(vector <tripl> :: iterator v = T.begin();v != T.end();++v){
if(v->x != cd[i] || F[cd[i]][v->y] == cap[cd[i]][v->y] || viz[v->y] == 1)continue;
viz[v->y] = 1;
pred[v->y] = cd[i];
cd[++cd[0]] = v->y;
}
}
return viz[N];
}
void BFS2(int s,bool ok,bool vec[]){
memset(viz,0,sizeof(viz));
viz[s] = 1;
cd[0] = 1;
cd[1] = s;
vec[s] = 1;
for(int i = 1;i <= cd[0];i++){
for(vector <tripl> :: iterator it = T.begin();it != T.end();++it){
if(it->x != cd[i] || viz[it->y] == 1)continue;
if(F[cd[i]][it->y] == cap[cd[i]][it->y]){
vec[cd[i]] = 1;
if(ok == 1 && source[it->y] == 1)R.push_back(it->nr);
}
else{
viz[it->y] = 1;
cd[++cd[0]] = it->y;
}
}
}
}
int main(){
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d %d ",&N,&M);
int i,z,fmin = inf,x,y;
tripl aux_vec;
for(i = 1;i <= M;i++){
scanf("%d %d %d ",&x,&y,&z);
cap[x][y] = cap[y][x] = z;
T.push_back(make_tripl(x,y,i));
T.push_back(make_tripl(y,x,i));
}
int flow = 0;
while(BFS1()){
for(vector <tripl> :: iterator v = T.begin();v != T.end();++v){
if(v->x == N && F[v->y][N] < cap[v->y][N] && viz[v->y] == 1){
pred[N] = v->y;
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;
}
flow += fmin;
}
}
}
BFS2(1,0,source);
BFS2(N,1,dest);
//printf("%d\n",flow);
printf("%d\n",R.size());
for(vector <int> :: iterator it = R.begin();it != R.end();++it)printf("%d\n",*it);
printf("\n");
return 0;
}