Pagini recente » Cod sursa (job #1148645) | Cod sursa (job #134446) | Cod sursa (job #979086) | Cod sursa (job #404443) | Cod sursa (job #921489)
Cod sursa(job #921489)
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<set>
#include<queue>
#define min(a,b) ((a)<(b)?(a):(b))
static bool a[1005],b[1005];
static int c[1005][1005], f[1005][1005], parent[1005];
static int seen[1005], seenc;
static int n;
static std::vector<int> v[1005];
static struct
{
int x,y;
}e[10005];
bool bfs(void)
{
std::queue<int> q;
q.push (1);
seen[1]=++seenc;
while(!q.empty()){
int n=q.front();
q.pop();
for(std::vector<int>::iterator it=v[n].begin();it!=v[n].end();it++)
if(c[n][*it] != f[n][*it] && seen[*it]<seenc){
seen[*it]=seenc;
q.push (*it);
parent[*it]=n;
if(*it==::n)
return 1;
}
}
return 0;
}
void dfs (int i, bool *s)
{
s[i]=1;
for(std::vector<int>::iterator it=v[i].begin();it!=v[i].end();it++)
if(c[i][*it] != abs (f[i][*it]) && !s[*it])
dfs (*it,s);
}
int main (void)
{
freopen ("critice.in","r",stdin);
#ifdef INFOARENA
freopen ("critice.out","w",stdout);
#endif
int m;
scanf ("%d%d",&n,&m);
for(int i=0;i<m;i++){
int z;
scanf ("%d%d%d",&e[i].x,&e[i].y,&z);
if(z==0)
continue;
c[e[i].x][e[i].y]=c[e[i].y][e[i].x]=z;
v[e[i].x].push_back (e[i].y);
v[e[i].y].push_back (e[i].x);
}
while(bfs()){
int fmin=0x3F3F3F;
for(int i=n;i>1;i=parent[i])
fmin=min (fmin, c[parent[i]][i] - f[parent[i]][i]);
for(int i=n;i>1;i=parent[i])
f[parent[i]][i]+=fmin, f[i][parent[i]]-=fmin;
}
dfs (1, a);
dfs (n, b);
std::vector<int> r;
for(int i=0;i<m;i++)
if(abs (f[e[i].x][e[i].y]) == c[e[i].x][e[i].y] && ((a[e[i].x] && b[e[i].y]) || (a[e[i].y] && b[e[i].x])))
r.push_back (i+1);
printf ("%lu\n",r.size());
for(unsigned i=0;i<r.size();i++)
printf ("%d\n",r[i]);
return 0;
}