Pagini recente » Cod sursa (job #2930873) | Cod sursa (job #369115) | Cod sursa (job #3226578) | Cod sursa (job #2449133) | Cod sursa (job #2209097)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
const int N=1005;
const int INF=2000000000;
int n,m,flux,vmin,s=1,d;
vector<int> a[N];
int sol[N],k;
int m1[N],m2[N];
int f[N][N];
int c[N][N];
int q[2*N];
int pred[N];
bool viz[N],viz2[N];
void citire()
{
int i,x,y,z;
in>>n>>m;
d=n;
for(i=1; i<=m; i++)
{
in>>x>>y>>z;
m1[i]=x;
m2[i]=y;
a[x].push_back(y);
a[y].push_back(x);
c[x][y]=z;
c[y][x]=z;
}
}
bool bfs()
{
int st=0,dr=-1,x,y;
for(x=1; x<=n; x++)
{
viz[x]=false;
}
q[++dr]=s;
viz[1]=true;
while(st<=dr)
{
x=q[st++];
for(y=1; y<=n; y++)
{
if(!viz[y] && c[x][y]>f[x][y])
{
q[++dr] = y;
viz[y] = true;
pred[y] = x;
if (y == d)
{
return true;
}
}
}
}
return false;
}
int drum_minim()
{
int x = d, vmin = INF;
while (x != s)
{
vmin = min(vmin, c[pred[x]][x] - f[pred[x]][x]);
x = pred[x];
}
return vmin;
}
void actualizare_drum(int vmin)
{
int x = d;
while (x != s)
{
f[pred[x]][x] += vmin;
f[x][pred[x]] -= vmin;
x = pred[x];
}
}
void dfss(int nod)
{
int i,vecin;
viz[nod]=true;
for(i=0; i<a[nod].size(); i++)
{
vecin=a[nod][i];
if(viz[vecin]==false && c[nod][vecin]>f[nod][vecin])
dfss(vecin);
}
}
void dfsd(int nod)
{
int i,vecin;
viz2[nod]=true;
for(i=0; i<a[nod].size(); i++)
{
vecin=a[nod][i];
if(viz2[vecin]==false && c[nod][vecin]>f[nod][vecin])
dfsd(vecin);
}
}
int modul(int x)
{
if(x<0)
return -x;
return x;
}
void afisare()
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
out<<f[i][j]<<" ";
out<<'\n';
}
out<<'\n';
}
void afisare1()
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
out<<c[i][j]<<" ";
out<<'\n';
}
out<<'\n';
}
int main()
{
int i,x,y;
citire();
while(bfs())
{
vmin=drum_minim();
flux=flux+vmin;
actualizare_drum(vmin);
}
for(i=1; i<=n; i++)
viz[i]=viz2[i]=false;
dfss(1);
dfsd(n);
/*for(i=1; i<=n; i++)
out<<viz[i]<<" ";
out<<endl;
for(i=1; i<=n; i++)
out<<viz2[i]<<" ";
out<<endl;
*/
//afisare();
// afisare1();
for(i=1; i<=m; i++)
{
x=m1[i];
y=m2[i];
if(modul(f[x][y])==c[x][y] && ((viz[x] && viz2[y])^(viz2[x] && viz[y])))
sol[++k]=i;
}
out<<k<<'\n';
for(i=1; i<=k; i++)
out<<sol[i]<<'\n';
return 0;
}