Pagini recente » Cod sursa (job #89334) | Cod sursa (job #1107683) | Clasament FMI No Stress 2012 | Cod sursa (job #2505881) | Cod sursa (job #340389)
Cod sursa(job #340389)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define file_in "critice.in"
#define file_out "critice.out"
#define Nmax 1005
#define pb push_back
struct muchie
{
int x,y;
}m[Nmax*20];
int G[Nmax][Nmax],gr[Nmax],c[Nmax][Nmax],n,mm,t[Nmax],f[Nmax][Nmax];
int viz1[Nmax],vizn[Nmax];
int viz[Nmax];
bool flux()
{
int i;
memset(t,0,sizeof(t));
memset(viz,0,sizeof(viz));
viz[1]=1;
queue<int> Q;
int nod,nod1;
t[1]=-1;
for(Q.push(1);!Q.empty();Q.pop())
{
nod=Q.front();
for(i=1;i<=gr[nod];++i)
{
nod1=G[nod][i];
if(!viz[nod1] && c[nod][nod1]>f[nod][nod1])
{
t[nod1]=nod;
viz[nod1]=1;
if(nod1==n)
return true;
Q.push(nod1);
}
}
}
return false;
}
void bfs1()
{
int i,nod,nod1;
queue<int> Q;
viz1[1]=1;
for(Q.push(1);!Q.empty();Q.pop())
{
nod=Q.front();
for(i=1;i<=gr[nod];++i)
{
nod1=G[nod][i];
if(!viz1[nod1] && c[nod][nod1]>abs(f[nod][nod1]))
{
viz1[nod1]=1;
Q.push(nod1);
}
}
}
}
void bfsn()
{
int i,nod,nod1;
queue<int> Q;
vizn[n]=1;
for(Q.push(n);!Q.empty();Q.pop())
{
nod=Q.front();
for(i=1;i<=gr[nod];++i)
{
nod1=G[nod][i];
if(!vizn[nod1] && c[nod][nod1]>abs(f[nod][nod1]))
{
vizn[nod1]=1;
Q.push(nod1);
}
}
}
}
int main()
{
int i;
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d %d" ,&n,&mm);
int x,y,z;
for(i=1;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]=c[y][x]=z;
}
while(flux())
{
int v=0x3f3f3f3f,i=n;
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();
vector<int> vv;
int sol=0;
for(i=1;i<=mm;++i)
{
if((viz1[m[i].x] && vizn[m[i].y]) || (viz1[m[i].y] && vizn[m[i].x]))
{
vv.pb(i);
sol++;
}
}
printf("%d\n",sol);
for(i=0;i<sol;++i)
printf("%d\n",vv[i]);
fclose(stdin);
fclose(stdout);
return 0;
}