Pagini recente » Cod sursa (job #1410564) | Cod sursa (job #2489666) | Cod sursa (job #2912313) | Cod sursa (job #976851) | Cod sursa (job #1050166)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
struct Edge
{
int x,y;
} a[10005];
typedef vector<int> Graf[1005];
Graf G,R,T;
int C[1005][1005];
int F[1005][1005];
int n,m,d[1005],p[1005];
bool v1[1005],v2[1005];
bool bfs()
{
memset(d,0,sizeof(d));
memset(p,0,sizeof(p));
queue<int> q;
q.push(1);d[1]=1;
while(!q.empty())
{
int u=q.front();
for(vector<int>::iterator it=G[u].begin();it!=G[u].end();it++)
if(F[u][*it]<C[u][*it] && !d[*it])
{
d[*it]=d[u]+1;
p[*it]=u;
q.push(*it);
}
q.pop();
}
if(d[n])
return true;
return false;
}
void dfs(int u,bool viz[1005],const Graf &G)
{
viz[u]=true;
for(vector<int>::const_iterator it=G[u].begin();it!=G[u].end();it++)
if(!viz[*it])
dfs(*it,viz,G);
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&n,&m);
for(int c,i=1;i<=m;i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&c);
G[a[i].x].push_back(a[i].y);
G[a[i].y].push_back(a[i].x);
C[a[i].x][a[i].y]=C[a[i].y][a[i].x]=c;
}
while(bfs())
{
int fmin=C[p[n]][n]-F[p[n]][n];
for(int u=n;u!=1;u=p[u])
fmin=min(fmin,C[p[u]][u]-F[p[u]][u]);
for(int u=n;u!=1;u=p[u])
{
F[p[u]][u]+=fmin;
F[u][p[u]]-=fmin;
}
}
///for(int i=1;i<=m;i++)
/// printf("%d %d: %d/%d\n",a[i].x,a[i].y,F[a[i].x][a[i].y],C[a[i].x][a[i].y]);
for(int i=1;i<=m;i++)
{
if(F[a[i].x][a[i].y]<C[a[i].x][a[i].y])
R[a[i].x].push_back(a[i].y),
T[a[i].y].push_back(a[i].x);
if(F[a[i].y][a[i].x]<C[a[i].y][a[i].x])
R[a[i].y].push_back(a[i].x),
T[a[i].x].push_back(a[i].y);
}
dfs(1,v1,R);
dfs(n,v2,T);
vector<int> sol;
for(int i=1;i<=m;i++)
{
if(F[a[i].x][a[i].y]==C[a[i].x][a[i].y] && v1[a[i].x] && v2[a[i].y])
sol.push_back(i);
if(F[a[i].y][a[i].x]==C[a[i].y][a[i].x] && v1[a[i].y] && v2[a[i].x])
sol.push_back(i);
}
printf("%d\n",(int)sol.size());
for(int i=0;i<(int)sol.size();i++)
printf("%d\n",sol[i]);
return 0;
}