Pagini recente » Cod sursa (job #53381) | Cod sursa (job #763626) | Cod sursa (job #2128922) | Cod sursa (job #729495) | Cod sursa (job #190606)
Cod sursa(job #190606)
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int NMAX=1001;
vector<int> g[NMAX];
int a[10001][2],r[NMAX][NMAX],c[NMAX][NMAX];
int n,m,nr=0,v[NMAX],minim;
ifstream fin("critice.in");
ofstream fout("critice.out");
void citeste(){
int i,j,k,w;
fin>>n>>m;
for (k=1;k<=m;++k){
fin>>i>>j>>w;
g[i].push_back(j);
g[j].push_back(i);
c[i][j]=c[j][i]=w;
a[k][0]=i;
a[k][1]=j;}
}
int modul(int x){
return x>0?x:-x;
}
bool bf(){
bool gasit=false;
int t[NMAX],w;
vector<int>::iterator it;
queue<int> q;
memset(t,-1,sizeof(t));
q.push(1);t[1]=0;
while (!q.empty() && !gasit){
w=q.front();
q.pop();
for (it=g[w].begin();it!=g[w].end();it++)
if (r[w][*it]<c[w][*it])
if (t[*it]==-1){
t[*it]=w;
q.push(*it);
if (*it==n) gasit=true;
}
}
if (!gasit) return false;
minim=9999999;
for (w=n;w!=1;w=t[w])
if ((c[t[w]][w]-r[t[w]][w])<minim) minim=(c[t[w]][w]-r[t[w]][w]);
for (w=n;w!=1;w=t[w]){
r[t[w]][w]+=minim;
r[w][t[w]]-=minim;}
return true;
}
void flux(){
int f=0;
bool w;
while(1){
w=bf();
if (!w) break;
f+=minim;}
//fout<<f<<'\n';
}
bool viz1[NMAX],viz2[NMAX];
void bfs(int vf,bool viz[]){
queue<int> q;
int i;
memset(viz,false,sizeof(viz));
viz[vf]=true;
q.push(vf);
while (!q.empty()){
i=q.front();
q.pop();
for (vector<int>::iterator it=g[i].begin();it!=g[i].end();it++)
if (!viz[*it] && modul(r[i][*it])<c[i][*it]) {
viz[*it]=true;
q.push(*it);}
}
}
void critice(){
int i,j,k;
bool w;
bfs(1,viz1);
bfs(n,viz2);
for (k=1;k<=m;++k){
i=a[k][0];
j=a[k][1];
if (viz1[i] && viz2[j] || viz1[j] && viz2[i])
v[++nr]=k;
}
fout<<nr<<'\n';
for (i=1;i<=nr;++i) fout<<v[i]<<'\n';
}
int main(){
citeste();
flux();
critice();
return 0;
}