Pagini recente » Cod sursa (job #1631868) | Cod sursa (job #2897991) | Cod sursa (job #3194132) | Cod sursa (job #2604110) | Cod sursa (job #728709)
Cod sursa(job #728709)
#include <cstdio>
#include <fstream>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
#define f first
#define s second
#define pb push_back
typedef vector<int>::iterator IT;
const int N=1024;
pair<int,int>M[10001];
vector<int> v[N],sol;
int c[N][N],f[N][N],n,m,t[N];
void read ()
{
ifstream in ("critice.in");
in>>n>>m;
for(int x,y,cst,i=1;i<=m;++i)
{
in>>x>>y>>cst;
v[x].pb(y);
v[y].pb(x);
c[x][y]=c[y][x]=cst;
M[i].f=y;
M[i].s=x;
}
}
bool BF ()
{
vector<bool> uz(n+1);
queue<int> q;
for(q.push(1);q.size();q.pop())
{
int nd=q.front();
for(IT it=v[nd].begin();it<v[nd].end();++it)
if(!uz[*it]&&c[nd][*it]-f[nd][*it]>0)
{
uz[*it]=1;
t[*it]=nd;
q.push(*it);
}
}
return uz[n];
}
vector<int> BFS (int nd)
{
vector<int> uz(n+1);
queue<int> q;
for(q.push(nd);q.size();q.pop())
{
nd=q.front();
for(IT it=v[nd].begin();it<v[nd].end();++it)
if(!uz[*it]&&c[nd][*it]-(int)abs((double)f[nd][*it])>0&&*it!=n&&*it!=1)
{
uz[*it]=1;
q.push(*it);
}
}
return uz;
}
void solve ()
{
for(;BF();)
{
for(IT it=v[n].begin();it<v[n].end();++it)
{
int mm=c[*it][n]-f[*it][n];
for(int i=*it;i!=1;i=t[i])
if(mm>c[t[i]][i]-f[t[i]][i])
mm=c[t[i]][i]-f[t[i]][i];
f[*it][n]+=mm;
f[n][*it]-=mm;
for(int i=*it;i!=1;i=t[i])
{
f[t[i]][i]+=mm;
f[i][t[i]]-=mm;
}
}
}
vector<int> uz1=BFS(1);
vector<int> uz2=BFS(n);
uz1[1]=1;
uz2[n]=1;
for(int i=1;i<=m;++i)
{
int x=M[i].f,y=M[i].s;
if((f[x][y]==c[x][y]||f[y][x]==c[y][x])&&((uz1[x]&uz2[y])||(uz1[y]&uz2[x])))
sol.pb(i);
}
}
void out ()
{
freopen ("critice.out","w",stdout);
printf("%d\n",sol.size());
for(IT it=sol.begin();it<sol.end();++it)
printf("%d\n",*it);
}
int main ()
{
read ();
solve ();
out ();
return 0;
}