Pagini recente » Cod sursa (job #1709387) | Cod sursa (job #2933870) | Cod sursa (job #2547612) | Cod sursa (job #2866188) | Cod sursa (job #234826)
Cod sursa(job #234826)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define N 1005
#define pb push_back
struct muchie
{
int x,y;
};
int a[N][N],cate[N],c[N][N],n,m,t[N];
muchie mu[10010];
bool v1[N],vn[N];
void citire()
{
scanf("%d%d",&n,&m);
int x,y,z;
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&x,&y,&z);
a[y][++cate[y]]=mu[i].x=x;
a[x][++cate[x]]=mu[i].y=y;
c[x][y]=c[y][x]=z;
}
}
bool flux()
{
memset(t,0,sizeof(t));
bool viz[N]={0};
viz[1]=true;
queue<int> q;
q.push(1);
int nod,nod1;
t[1]=-1;
while(!q.empty())
{
nod=q.front();
q.pop();
for(int i=1; i<=cate[nod]; i++)
{
nod1=a[nod][i];
if(!viz[nod1] && c[nod][nod1])
{
t[nod1]=nod;
viz[nod1]=true;
if(nod1==n)
return true;
q.push(nod1);
}
}
}
return false;
}
void bfs1()
{
queue<int> q;
q.push(1);
v1[1]=true;
while(!q.empty())
{
int nod=q.front();
q.pop();
for(int i=1; i<=cate[nod]; i++)
{
int nod1=a[nod][i];
if(!v1[nod1] && c[nod][nod1])
{
v1[nod1]=true;
q.push(nod1);
}
}
}
}
void bfsn()
{
queue<int> q;
q.push(n);
vn[n]=true;
while(!q.empty())
{
int nod=q.front();
q.pop();
for(int i=1; i<=cate[nod]; i++)
{
int nod1=a[nod][i];
if(!vn[nod1] && c[nod][nod1])
{
vn[nod1]=true;
q.push(nod1);
}
}
}
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
citire();
while(flux())
{
int r=1<<30,i=n;
while(i!=1)
{
r=min(r,c[t[i]][i]);
i=t[i];
}
i=n;
while(i!=1)
{
c[t[i]][i]-=r;
c[i][t[i]]+=r;
i=t[i];
}
}
bfs1();
bfsn();
vector<int> sol;
int rez=0;
for(int i=0; i<m; i++)
{
if((v1[mu[i].x] && vn[mu[i].y] && c[mu[i].x][mu[i].y]==0) || (v1[mu[i].y] && vn[mu[i].x] && c[mu[i].y][mu[i].x]==0))
{
sol.pb(i+1);
rez++;
}
}
printf("%d\n",rez);
for(int i=0; i<rez; i++)
printf("%d\n",sol[i]);
return 0;
}