Pagini recente » Cod sursa (job #1516521) | Cod sursa (job #2863930) | Cod sursa (job #696935) | Cod sursa (job #375258) | Cod sursa (job #84957)
Cod sursa(job #84957)
using namespace std;
#include <cstdio>
#include <vector>
#include <string>
#define maxn 1024
#define pb push_back
#define short int
vector<short> a[maxn];
short c[maxn][maxn];
short t[maxn];
int n, m;
short muchii[10001][2], nm;
bool sol1[maxn][maxn],sol2[maxn][maxn];
void read()
{
freopen("critice.in","r",stdin);
scanf("%d %d\n", &n, &m);
int p, q, w;
while(m--)
{
scanf("%d %d %d\n", &p, &q, &w);
c[p][q]=c[q][p]=w;
a[p].pb(q);
a[q].pb(p);
muchii[++nm][0]=p;
muchii[nm][1]=q;
}
}
inline int bfs()
{
short Q[maxn], p=1,q=1;
bool use[maxn];
memset(use, 0, sizeof(use));
memset(t, 0, sizeof(t));
use[1]=1;
Q[1]=1;
int u;
vector<short>::iterator it;
while(p<=q)
{
u=Q[p++];
for(it=a[u].begin();it!=a[u].end();++it)
if(c[u][*it])
if(!use[*it])
{
use[*it]=1;
t[*it]=u;
Q[++q]=*it;
}
}
if(t[n]==0)return 0;
return 1;
}
void maxflow()
{
int min=0, i, ok;
vector<short>::iterator it;
while(bfs())
{
for(it=a[n].begin();it!=a[n].end();++it)
{
min=c[*it][n];
if(min==0)continue;
ok=1;
for(i=*it;i!=1; i=t[i])if(t[i]==0 && i!=1){ok=0;break;}
if(ok==0)continue;
for(i=*it;i!=1; i=t[i])min<?=c[t[i]][i];
if(min==0)continue;
for(i=*it;i!=1; i=t[i]) c[t[i]][i]-=min, c[i][t[i]]+=min;
}
}
}
void bfs1()
{
short Q[maxn], p=1, q=1;
bool use[maxn];
memset(use, 0, sizeof(use));
Q[1]=1;
int u;
vector<short>::iterator it;
while(p<=q)
{
u=Q[p++];
for(it=a[u].begin();it!=a[u].end();++it)
if(!use[*it])
if(c[u][*it]==0) sol1[u][*it]=sol1[*it][u]=1;
else if(c[u][*it]>0)
{
Q[++q]=*it;
use[*it]=1;
}
}
}
void bfs2()
{
short Q[maxn], p=1, q=1;
bool use[maxn];
memset(use, 0, sizeof(use));
Q[1]=n;
int u;
vector<short>::iterator it;
while(p<=q)
{
u=Q[p++];
//printf("%d\n", u);
for(it=a[u].begin();it!=a[u].end();++it)
if(!use[*it])
if(c[*it][u]==0) sol2[u][*it]=sol2[*it][u]=1;
else if(c[*it][u]>0)
{
Q[++q]=*it;
use[*it]=1;
}
}
}
int main()
{
freopen("critice.out","w",stdout);
read();
maxflow();
bfs1();
bfs2();
int nrsol=0;
for(int i=1;i<=nm;++i)
if(sol1[muchii[i][0]][muchii[i][1]] && sol2[muchii[i][0]][muchii[i][1]])
++nrsol;
printf("%d\n", nrsol);
for(int i=1;i<=nm;++i)
if(sol1[muchii[i][0]][muchii[i][1]] && sol2[muchii[i][0]][muchii[i][1]])
printf("%d\n", i);
return 0;
}