Pagini recente » Cod sursa (job #1498335) | Cod sursa (job #2360507) | Cod sursa (job #2558707) | Cod sursa (job #2792608) | Cod sursa (job #425889)
Cod sursa(job #425889)
#include <cstdio>
#include <string>
#include <vector>
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];*/
vector<int> G[nmax];
inline int min(int x,int y)
{
if(x<y) return x;
return y;
}
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;
G[x].push_back(y);
G[y].push_back(x);
//add(G[x],y);
//add(G[y],x);
}
}
bool bfs()
{
k=0;
Q[++k]=1;
int i,x,y,j;
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(j=0;j<G[x].size()&&!ok;j++)
{
y=G[x][j];
if(!viz[y]&&C[x][y]-Fx[x][y]>0)
{
f[y]=min(f[x],C[x][y]-Fx[x][y]);
pre[y]=x;
viz[y]=true;
Q[++k]=y;
if(y==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,j,y;
for(i=1;i<=k;i++)
{
x=Q[i];
s[x]=z;
for(j=0;j<G[x].size();j++)
{
y=G[x][j];
if(!viz[y]&&((z==1)?(C[x][y]-Fx[x][y]>0):(C[y][x]-Fx[y][x]>0)))
{
viz[y]=true;
Q[++k]=y;
}
}
}
}
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;
}