Pagini recente » Cod sursa (job #2477742) | Cod sursa (job #2407607) | Cod sursa (job #1109293) | Cod sursa (job #2884204) | Cod sursa (job #340388)
Cod sursa(job #340388)
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define file_in "critice.in"
#define file_out "critice.out"
#define Nmax 1005
#define pb push_back
#define Inf 0x3f3f3f3f
struct muchie
{
int x,y;
}
m[10*Nmax];
int n,mm;
int sol;
int viz[10*Nmax];
int viz1[10*Nmax];
int vizn[10*Nmax];
int c[Nmax][Nmax];
int f[Nmax][Nmax];
int t[10*Nmax];
int gr[10*Nmax];
int G[Nmax][Nmax];
bool flux()
{
memset(t,0,sizeof(t));
memset(viz,0,sizeof(viz));
viz[1]=1;
queue <int> Q;
int nod,nnod,i;
vector<int> :: iterator it;
t[1]=-1;
for(Q.push(1);!Q.empty();Q.pop())
{
nod=Q.front();
for (i=1;i<=gr[nod];++i)
{
nnod=G[nod][i];
if(!viz[nnod] && c[nod][nnod]>f[nod][nnod])
{
t[nnod]=nod;
viz[nnod]=1;
if(nnod==n)
return true;
Q.push(nnod);
}
}
}
return false;
}
void bfs1()
{
queue <int> Q;
vector <int> :: iterator it;
int nod,nnod,i;
memset(viz1,0,sizeof(viz1));
viz1[1]=1;
for (Q.push(1);!Q.empty();Q.pop())
{
nod=Q.front();
for (i=1;i<=gr[nod];++i)
{
nnod=G[nod][i];
if (!viz1[nnod] && c[nnod][nnod]>abs(f[nnod][nnod]))
{
Q.push(nnod);
viz1[nnod]=1;
}
}
}
}
void bfsn()
{
queue <int> Q;
vector <int> :: iterator it;
int nod,nnod,i;
memset(vizn,0,sizeof(vizn));
vizn[n]=1;
for (Q.push(n);!Q.empty();Q.pop())
{
nod=Q.front();
for (i=1;i<=gr[nod];++i)
{
nnod=G[nod][i];
if (!vizn[nnod] && c[nnod][nnod]>abs(f[nnod][nnod]))
{
Q.push(nnod);
vizn[nnod]=1;
}
}
}
}
int main()
{
int i,x,y,z,flow,u,v;
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d %d", &n,&mm);
for (i=0;i<mm;++i)
{
scanf("%d %d %d", &x, &y,&z);
G[y][++gr[y]]=x;
G[x][++gr[x]]=y;
m[i].x=x;
m[i].y=y;
c[x][y]=z;
c[y][x]=z;
}
while(flux())
{
i=n;
v=Inf;
while(i!=1)
{
v=min(v,c[t[i]][i]-f[t[i]][i]);
i=t[i];
}
i=n;
while(i!=1)
{
f[t[i]][i]+=v;
f[i][t[i]]-=v;
i=t[i];
}
}
bfs1();
bfsn();
sol=0;
vector<int> vv;
for (i=0;i<mm;++i)
if ((viz1[m[i].x] && vizn[m[i].y]) || (viz1[m[i].y] && vizn[m[i].x]))
{
sol++;
vv.pb(i+1);
}
printf("%d\n", sol);
for (i=0;i<sol;++i)
printf("%d\n", vv[i]);
fclose(stdin);
fclose(stdout);
return 0;
}