Pagini recente » Cod sursa (job #2110470) | Cod sursa (job #2254308) | Cod sursa (job #2035777) | Cod sursa (job #178241) | Cod sursa (job #425883)
Cod sursa(job #425883)
#include <cstdio>
#include <string>
using namespace std;
FILE *fin=fopen("critice.in","r");
FILE *fout=fopen("critice.out","w");
#define nmax 1005
#define mmax 10002
#define inf 1<<18
struct muchie
{
int x,y;
};
muchie M[mmax];
int C[nmax][nmax],Fx[nmax][nmax];
int sol[mmax],nr;
int pre[nmax];
int Q[nmax*5],k;
int f[nmax];
int s[nmax];
int n,m;
#define Q (Q-1)
bool viz[nmax];
struct graf
{
int x;
graf *urm;
};
graf *G[nmax];
inline int min(int x,int y)
{
if(x<y) return x;
return y;
}
void add(graf *&g,int x)
{
graf *p=new graf;
p->x=x;
p->urm=g;
g=p;
}
void read()
{
fscanf(fin,"%d %d",&n,&m);
int i,x,y,c;
for(i=1;i<=m;i++)
{
fscanf(fin,"%d %d %d",&x,&y,&c);
M[i].x=x;
M[i].y=y;
C[x][y]=c;
C[y][x]=c;
add(G[x],y);
add(G[y],x);
}
}
bool bfs()
{
k=0;
Q[++k]=1;
int i,x;
bool ok=false;
for(i=1;i<=n;i++) {pre[i]=-1;viz[i]=false;}
viz[1]=true;
for(i=1;i<=k&&!ok;i++)
{
x=Q[i];
for(graf *g=G[x];g!=NULL&&!ok;g=g->urm)
{
if(!viz[g->x]&&C[x][g->x]-Fx[x][g->x]>0)
{
f[g->x]=min(f[x],C[x][g->x]-Fx[x][g->x]);
pre[g->x]=x;
viz[g->x]=true;
Q[++k]=g->x;
if(g->x==n)
ok=true;
}
}
}
return viz[n];
}
void bfs(int nod,int z)
{
k=0;
memset(viz,false,sizeof(viz));
Q[++k]=nod;
viz[nod]=true;
int i,x;
for(i=1;i<=k;i++)
{
x=Q[i];
s[x]=z;
for(graf *g=G[x];g!=NULL;g=g->urm)
{
if(!viz[g->x]&&((z==1)?(C[x][g->x]-Fx[x][g->x]>0):(C[g->x][x]-Fx[g->x][x]>0)))
{
viz[g->x]=true;
Q[++k]=g->x;
}
}
}
}
void solve()
{
bfs(1,1);
bfs(n,2);
int i,x,y;
for(i=1;i<=m;i++)
{
x=M[i].x;
y=M[i].y;
if( (!(C[x][y]-Fx[x][y]) && (C[y][x]-Fx[y][x]) || !(C[y][x]-Fx[y][x]) && (C[x][y]-Fx[x][y])) && (s[x]+s[y]==3))
sol[++nr]=i;
}
fprintf(fout,"%d\n",nr);
for(i=1;i<=nr;i++)
fprintf(fout,"%d\n",sol[i]);
}
int main()
{
int i;
read();
f[1]=inf;
while(bfs())
{
for(i=n;pre[i]!=-1;i=pre[i])
{
Fx[pre[i]][i]+=f[n];
Fx[i][pre[i]]-=f[n];
}
f[1]=inf;
}
solve();
return 0;
}