Pagini recente » Cod sursa (job #921398) | Cod sursa (job #373102) | Cod sursa (job #2575450) | Cod sursa (job #1854892) | Cod sursa (job #221059)
Cod sursa(job #221059)
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
#define FOR(i,a,b) for (i=a;i<=b;i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
int v[1005],vs[1005],vd[1005],cap[1005][1005],pred[1005],n;
vector<vector<int> >a(1005);
int flux()
{
queue<int> q;
memset(v,0,sizeof(v));
pred[n]=0;
q.push(1);
v[1]=1;
while (!q.empty())
{
int nod=q.front();
q.pop();
vector<int>::iterator it;
fori(it,a[nod])
{
if (!v[*it]&&cap[nod][*it])
{
pred[*it]=nod;
v[*it]=1;
q.push(*it);
}
}
}
if (pred[n]==0)
return 0;
int y=n,capacitate=1<<30;
while (pred[y])
{
capacitate=min(capacitate,cap[pred[y]][y]);
y=pred[y];
}
y=n;
while (pred[y])
{
cap[pred[y]][y]-=capacitate;
cap[y][pred[y]]+=capacitate;
y=pred[y];
}
return 1;
}
void bfss()
{
queue<int> q;
q.push(1);
vs[1]=1;
while (!q.empty())
{
int nod=q.front();
q.pop();
vector<int>::iterator it;
fori(it,a[nod])
if (!vs[*it]&&cap[nod][*it])
{
q.push(*it);
vs[*it]=1;
}
}
}
void bfsd()
{
queue<int> q;
q.push(n);
vd[n]=1;
while (!q.empty())
{
int nod=q.front();
q.pop();
vector<int>::iterator it;
fori(it,a[nod])
if (!vd[*it]&&cap[*it][nod])
{
q.push(*it);
vd[*it]=1;
}
}
}
int main()
{
FILE *in,*out;
int m,i,x,y,z;
vector<pair<int,int> > b;
vector<int> c;
in=fopen("critice.in","r");
out=fopen("critice.out","w");
fscanf(in,"%d%d",&n,&m);
FOR(i,1,m)
{
fscanf(in,"%d%d%d",&x,&y,&z);
b.pb(mp(x,y));
a[x].pb(y);
a[y].pb(x);
cap[x][y]=cap[y][x]=z;
}
while (flux());
bfss();
bfsd();
FOR(i,0,m-1)
{
if ((vs[b[i].fs]&&vd[b[i].ss]&&cap[b[i].fs][b[i].ss]==0)||(vs[b[i].ss]&&vd[b[i].fs]&&cap[b[i].ss][b[i].fs]==0))
{
c.pb(i+1);
}
}
fprintf(out,"%d\n",c.size());
vector<int>::iterator it;
fori(it,c)
fprintf(out,"%d\n",*it);
fclose(in);
fclose(out);
return 0;
}