Pagini recente » Cod sursa (job #2389770) | Cod sursa (job #472694) | Cod sursa (job #127168) | Cod sursa (job #474548) | Cod sursa (job #190580)
Cod sursa(job #190580)
#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];
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);
r[i][j]=r[j][i]=w;
a[k][0]=i;
a[k][1]=j;}
}
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]>0)
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 (r[t[w]][w]<minim) minim=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 viz[NMAX];
void bfs(int vf){
queue<int> q;
int i;
memset(viz,false,sizeof(viz));
viz[vf]=true;
while (!q.empty()){
i=q.front();
q.pop();
for (vector<int>::iterator it=g[i].begin();it!=g[i].end();it++)
if (!viz[*it] && r[i][*it]>0) {
viz[*it]=true;
q.push(*it);}
}
}
void critice(){
int i,j,k;
bool w;
for (k=1;k<=m;++k){
i=a[k][0];
j=a[k][1];
if (r[i][j]==0 || r[j][i]==0)
{
r[i][j]++;
r[j][i]++;
w=false;
bfs(1);
if (viz[n]) {
bfs(n);
r[j][i]--;
if (viz[1]) w=true;}
if (w) v[++nr]=k;
r[i][j]--;
r[j][i]--;
}
}
fout<<nr<<'\n';
for (i=1;i<=nr;++i) fout<<v[nr]<<'\n';
}
int main(){
citeste();
flux();
critice();
return 0;
}