Pagini recente » Cod sursa (job #1104671) | Cod sursa (job #1640534) | Cod sursa (job #2786226) | Cod sursa (job #2524570) | Cod sursa (job #1245676)
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct muchie
{
int x,y;
}muc[1001];
vector<int>v[1001];
int f[1001][1001],c[1001][1001],tata[1001];
int n,m,x,y,z,viz[1001],viz1[1001],sol[1001],k,i;
int BFS()
{
queue<int>q;
q.push(1);
memset(viz,0,sizeof(viz));
viz[1]=1;
while(!q.empty())
{
int nod=q.front();
q.pop();
for (i=0;i<v[nod].size();++i)
{
int varf=v[nod][i];
if (c[nod][varf]>f[nod][varf] && viz[varf]==0)
{
q.push(varf);
tata[varf]=nod;
viz[varf]=1;
}
}
}
return viz[n];
}
void BFS1()
{
queue<int>q;
q.push(n);
viz1[n]=1;
while(!q.empty())
{
int nod=q.front();
q.pop();
for (i=0;i<v[nod].size();++i)
{
int varf=v[nod][i];
if (c[nod][varf]>f[nod][varf]*(-1) && viz1[varf]==0)
{
q.push(varf);
tata[varf]=nod;
viz1[varf]=1;
}
}
}
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&z);
muc[i].x=x;
muc[i].y=y;
v[x].push_back(y);
v[y].push_back(x);
c[x][y]=z;
c[y][x]=z;
}
int flux=0;
while(BFS())
{
for (i=0;i<v[n].size();++i)
{
int nod=v[n][i];
if (f[nod][n]==c[nod][n] || !viz[nod]) continue;
tata[n]=nod;
int fmin=c[tata[nod]][nod]-f[tata[nod]][nod];
for (nod=n;nod!=1;nod=tata[nod])
fmin=min(fmin,c[tata[nod]][nod]-f[tata[nod]][nod]);
if (fmin==0) continue;
for (nod=n;nod!=1;nod=tata[nod])
{
f[tata[nod]][nod]+=fmin;
f[nod][tata[nod]]-=fmin;
}
flux+=fmin;
}
}
x=BFS();
BFS1();
for (i=1;i<=m;++i)
if ((viz[muc[i].x]==1 && viz1[muc[i].y]==1) || (viz[muc[i].y]==1 && viz1[muc[i].x]==1))
sol[++k]=i;
printf("%d\n",k);
for (i=1;i<=k;++i) printf("%d\n",sol[i]);
return 0;
}