Pagini recente » Cod sursa (job #2591608) | Cod sursa (job #709272)
Cod sursa(job #709272)
#include<stdio.h>
#include<vector>
using namespace std;
FILE*f=fopen("critice.in","r");
FILE*g=fopen("critice.out","w");
int m,n,nr,x,y,z,minn,p,u,ok1,ok2,ok3,ok4,c[1001][1001],F[1001][1001],sol[10001],t[1001],d[1003];
char viz[1001],s1[1001],s2[1001];
struct tunele
{
int x,y;
}M[10001];
vector <int> v[1001];
int bfs()
{
d[1]=p=u=1;
int ok=0;
for(int i=1;i<=n;++i)
viz[i]=0;
while(p<=u)
{
int nod=d[p];
for(int i=0;i<v[nod].size();++i)
if(!viz[v[nod][i]]&&c[nod][v[nod][i]]-F[nod][v[nod][i]]>0)
{
if(v[nod][i]!=n)
{
t[v[nod][i]]=nod;
d[++u]=v[nod][i];
viz[v[nod][i]]=1;
}
else
ok=1;
}
++p;
}
return ok;
}
int intreg(int x)
{
if(x<0)
return -x;
return x;
}
void bfs2(int nod,char s[])
{
p=u=1;
d[p]=nod;
for(int i=1;i<=n;++i)
viz[i]=0;
if(nod==1)
ok1=1;
else if(nod==n)
ok2=1;
while(p<=u)
{
int nod=d[p];
for(int i=0;i<v[nod].size();++i)
if(!s[v[nod][i]]&&c[nod][v[nod][i]]-intreg(F[nod][v[nod][i]])>0)
{
if(v[nod][i]!=n&&v[nod][i]!=1)
{
d[++u]=v[nod][i];
s[v[nod][i]]=1;
}
}
++p;
}
}
int main()
{
fscanf(f,"%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
fscanf(f,"%d%d%d",&x,&y,&z);
M[i].x=x;
M[i].y=y;
v[x].push_back (y);
v[y].push_back (x);
c[x][y]=c[y][x]=z;
}
while(bfs())
{
for(int i=0;i<v[n].size();++i)
{
minn=c[v[n][i]][n]-F[v[n][i]][n];
for(int nod=v[n][i];nod!=1;nod=t[nod])
if(minn>c[t[nod]][nod]-F[t[nod]][nod])
minn=c[t[nod]][nod]-F[t[nod]][nod];
F[v[n][i]][n]+=minn;
F[n][v[n][i]]-=minn;
for(int nod=v[n][i];nod!=1;nod=t[nod])
{
F[t[nod]][nod]+=minn;
F[nod][t[nod]]-=minn;
}
}
}
bfs2(1,s1);
bfs2(n,s2);
s1[1]=1;
s2[n]=1;
for(int ii=1;ii<=m;++ii){
x=M[ii].x;
y=M[ii].y;
if((F[x][y]==c[x][y]||F[y][x]==c[y][x])&&((s1[x]&&s2[y])||(s2[x]&&s1[y])))
{
++nr;
sol[nr]=ii;
}
}
fprintf(g,"%d\n",nr);
for(int i=1;i<=nr;++i)
fprintf(g,"%d\n",sol[i]);
fclose(g);
fclose(f);
return 0;
}