Pagini recente » Cod sursa (job #658220) | Cod sursa (job #1651943) | Cod sursa (job #2078566) | Cod sursa (job #1761632) | Cod sursa (job #461040)
Cod sursa(job #461040)
#include <fstream>
#include <vector>
#include <queue>
#define Nmax 1005
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define INF 2147000000
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
vector< int > G[Nmax],v;
vector< int >:: iterator it;
queue< int > Q;
pair< int,int > M[Nmax*10];
int C[Nmax][Nmax],F[Nmax][Nmax];
int viz[2][Nmax],prev[Nmax];
int i,x,y,z,n,m,nr,wh;
int Fmin,Fmax;
inline int Minim(int x,int y){ return x<y ? x:y; }
inline int abs(int x){ return x>0 ? x:-x; }
int BF(int s,int st){
int x;
memset(viz[st],0,sizeof(viz[st]));
while(!Q.empty()) Q.pop();
Q.push(s); viz[st][s]=1;
while( ! Q.empty() ){
x=Q.front(); Q.pop();
if(x==n) return 1;
for(it=G[x].begin(); it!=G[x].end(); ++it){
if(viz[st][*it] || F[x][*it] == C[x][*it]) continue;
viz[st][*it]=1;
Q.push(*it);
prev[*it]=x;
}
}
return viz[st][n];
}
void BFC(int s,int st){
int x;
memset(viz[st],0,sizeof(viz[st]));
Q.push(s); viz[st][s]=1;
while( ! Q.empty() ){
x=Q.front(); Q.pop();
for(it=G[x].begin(); it!=G[x].end(); ++it){
if(viz[st][*it] || abs(F[x][*it]) == C[x][*it]) continue;
viz[st][*it]=1;
Q.push(*it);
}
}
//return viz[st][n];
}
int main(){
fin>>n>>m;
for(i=1;i<=m;++i){
fin>>x>>y>>z;
C[x][y]=C[y][x]=z;
M[i]=mp(x,y);
G[x].pb(y);
G[y].pb(x);
}
while( BF(1,0) ){
//for(it=G[n].begin(); it!=G[n].end(); ++it)
//if( viz[0][*it] ){
Fmin=INF; //prev[wh]=*it;
for(wh=n; wh!=1 ; wh=prev[wh])
Fmin=Minim(Fmin,C[prev[wh]][wh]-F[prev[wh]][wh]);
if( Fmin==0 ) continue;
for(wh=n; wh!=1; wh=prev[wh]){
F[prev[wh]][wh] += Fmin;
F[wh][prev[wh]] -= Fmin;
}
Fmax += Fmin;
}
BFC(1,0);
BFC(n,1);
for(i=1;i<=m;++i)
if( (viz[0][M[i].x] && viz[1][M[i].y])
||(viz[0][M[i].y] && viz[1][M[i].x]) ) ++nr,v.pb(i);
fout<<nr<<"\n";
for(it=v.begin(); it!=v.end(); ++it) fout<<*it<<"\n";
fclose(stdin); fclose(stdout);
return 0;
}