Pagini recente » Cod sursa (job #689916) | Cod sursa (job #1121938) | Cod sursa (job #2099362) | Cod sursa (job #2868931) | Cod sursa (job #392312)
Cod sursa(job #392312)
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
struct muchie{int a,b,c;
bool ok;} x[ 10010 ];
vector<int> v[ 1005 ];
int i,j,k,l,m,n,q[ 1005 ],t[ 1005 ],nr,c[1002][1002],Flux,flux;
int dfs(){
int p = 1,u=1,N,i;
memset(t,0,sizeof(t));
q[1] = 1;
int x;
t[1] = -1;
while(p <= u)
{x = q[p];
N = v[x].size();
for(i = 0; i < N ; i++)
if(!t[v[x][i]] && c[x][v[x][i]])
{t[v[x][i]] = x;
u++;
q[u] = v[x][i];
if(v[x][i] == n)return true;
}
p++;
}
return false;
}
int calc_flux(){
memset(c,0,sizeof(c));
int i,sol = 0,Min;
for(i = 1 ; i <= m ; i++)
c[x[i].a][x[i].b] = c[x[i].b][x[i].a] = x[i].c;
while(dfs()){
Min = 1<<30;
for(i = n ; t[i] != -1;i = t[i])
if(c[t[i]][i] < Min)
Min = c[t[i]][i];
sol += Min;
for(i = n ; t[i] != -1;i = t[i])
{c[t[i]][i] -= Min;
c[i][t[i]] -= Min;}
}
return sol;
}
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[i].a,&x[i].b,&x[i].c);
v[x[i].a].push_back(x[i].b);
v[x[i].b].push_back(x[i].a);
}
Flux = calc_flux();
for(i = 1 ; i <= m ; i++)
if(c[x[i].a][x[i].b] == 0)
x[i].ok = true;
for(i = 1 ; i <= m ; i++)
if(x[i].ok)
{x[i].c ++;
flux = calc_flux();
if(flux <= Flux)
x[i].ok = false;
else
nr++;
x[i].c --;
}
printf("%d\n",nr);
for(i = 1 ; i <= m ; i++)
if(x[i].ok)
printf("%d\n",i);
return 0;}