Pagini recente » Cod sursa (job #1029936) | Cod sursa (job #1693749) | Cod sursa (job #640768) | Cod sursa (job #2393746) | Cod sursa (job #1693774)
#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){
memset(viz,0,sizeof(viz));
viz[s] = 1;
cd[0] = 1;
cd[1] = s;
if(ok)dest[s] = 1;
else source[s] = 1;
for(int i = 1;i <= cd[0];i++){
for(vector <tripl> :: iterator v = T.begin();v != T.end();++v){
if(v->x != cd[i] || viz[v->y] == 1)continue;
if(F[cd[i]][v->y] == cap[cd[i]][v->y]){
if(ok){
dest[cd[i]] = 1;
if(source[cd[i]] == 1)R.push_back(v->nr);
}
else{
source[cd[i]] = 1;
}
}
else{
viz[v->y] = 1;
cd[++cd[0]] = v->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));
}
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;
}
}
}
}
BFS2(1,0);
BFS2(N,1);
printf("%d\n",R.size());
for(vector <int> :: iterator it = R.begin();it != R.end();++it)printf("%d ",*it);
printf("\n");
return 0;
}