Pagini recente » Cod sursa (job #2737694) | Cod sursa (job #1091795) | Cod sursa (job #3125577) | Cod sursa (job #1141412) | Cod sursa (job #287121)
Cod sursa(job #287121)
using namespace std;
#include <cstdio>
#include <algorithm>
#include <vector>
#define MAX_N 1010
#define MAX_M 10010
#define INF 1<<30
struct muchie {int n1,n2;} mu[MAX_M];
int n, m, x, y, z, i, nrcritice, fiu, nod, Min, t;
int sol[MAX_M], d[MAX_N], s[MAX_N], T[MAX_N], C[MAX_N][MAX_N], F[MAX_N][MAX_N], q[MAX_N];
vector <int> V[MAX_N];
void citire(){
FILE *f = fopen("critice.in", "r");
fscanf(f,"%d %d",&n,&m);
for(i=1; i<=m; i++){
fscanf(f,"%d %d %d",&x, &y, &z);
mu[i].n1 = x; mu[i].n2 = y;
C[x][y] = z; C[y][x] = z;
V[x].push_back(y); V[y].push_back(x);
}
fclose(f);
}
int BFS(){
memset(T, 0xff, (n+2) * sizeof(int));
int p = 1, u = 1, ok = 0, i;
q[1] = 1; T[1] = 0;
for(; p <= u; p++){
nod = q[p];
for( i = 0; i < (int)V[nod].size(); i++){
fiu = V[nod][i];
if( T[fiu] == -1 && C[nod][fiu] > F[nod][fiu] ){
if( fiu == n ){ ok = 1; continue;}
q[++u] = fiu;
T[fiu] = nod;
}
}
}
return ok;
}
void flux(){
while( BFS() )
for(i = 0; i < (int)V[n].size(); i++){
fiu = V[n][i];
if( T[fiu] != -1 && C[fiu][n] > F[fiu][n] ){
T[n] = fiu;
for(t = n, Min = INF; T[t] != 0; t = T[t] )
Min = min(Min, C[T[t]][t] - F[T[t]][t]);
for( t = n; T[t] != 0; t = T[t] )
F[T[t]][t]+=Min, F[t][T[t]]-=Min;
}
}
}
void critice(){
int p, u, i;
p = u = 1; q[1] = 1; s[1] = 1;
for( ; p <= u ;p++ ){
nod = q[p];
for(i = 0; i < (int)V[nod].size(); i++){
fiu = V[nod][i];
if( !s[fiu] && C[nod][fiu] > abs(F[nod][fiu]) ){
q[++u] = fiu;
s[fiu] = 1;
}
}
}
p = u = 1; q[1] = n; d[n] = 1;
for( ; p <= u ;p++ ){
nod = q[p];
for(i = 0; i < (int)V[nod].size(); i++){
fiu = V[nod][i];
if( !d[fiu] && C[nod][fiu] > abs(F[nod][fiu]) ){
q[++u] = fiu;
d[fiu] = 1;
}
}
}
for(i=1; i <= m; i++){
x = mu[i].n1 ; y =mu[i].n2;
if( ( s[x] && d[y] ) || ( s[y] && d[x] ) )
sol[++nrcritice] = i;
}
}
void afisare(){
FILE *g = fopen("critice.out", "w");
fprintf(g,"%d\n",nrcritice);
for(i=1; i<=nrcritice; i++)
fprintf(g,"%d\n",sol[i]);
fclose(g);
}
int main(){
citire();
flux();
critice();
afisare();
return 0;
}