Pagini recente » Cod sursa (job #2199966) | Cod sursa (job #1644913) | Cod sursa (job #2024872) | Cod sursa (job #2497807) | Cod sursa (job #646150)
Cod sursa(job #646150)
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#define infile "critice.in"
#define outfile "critice.out"
#define n_max 1005
#define INF 1<<30
#define pb push_back
#define FOR(g) \
for(vector<int> ::iterator it = g.begin(); it!=g.end(); ++it)
using namespace std;
vector < int > v[n_max], sol;
int T[n_max], T1[n_max], T2[n_max];
int C[n_max][n_max], F[n_max][n_max], edge[n_max][n_max];
int N, M;
void citeste()
{
freopen(infile,"r",stdin);
scanf("%d %d", &N, &M);
int x, y, cap;
for(int i=1;i<=M;i++)
{
scanf("%d %d %d",&x, &y, &cap);
v[x].pb(y);
v[y].pb(x);
C[x][y] = C[y][x] = cap;
edge[x][y] = edge[y][x] = i;
}
fclose(stdin);
}
int bfs(int S, int D, int *T)
{
queue < int > q;
q.push(S);
T[S] = S;
while(!q.empty())
{
int x = q.front();
q.pop();
if(x == D)
return 1;
FOR(v[x])
if(!T[*it] && C[x][*it] - F[x][*it] > 0)
{
q.push(*it);
T[*it] = x;
}
}
return 0;
}
void rezolva()
{
while(bfs(1, N, T))
{
FOR(v[N])
{
if(C[*it][N] == F[*it][N] || !T[*it])
continue;
int flux = INF;
T[N] = *it;
for(int i = N; i!=1; i = T[i])
flux = min(flux, C[T[i]][i] - F[T[i]][i]);
for(int i = N; i!=1; i = T[i])
F[T[i]][i] += flux, F[i][T[i]] -= flux;
}
memset(T,0,sizeof(T));
}
bfs(1,N,T1);
bfs(N,1,T2);
for(int i=1; i<=N; i++)
FOR(v[i])
if(C[i][*it] == F[i][*it] && T1[i] && T2[*it])
sol.pb(edge[i][*it]);
}
void afiseaza()
{
freopen(outfile,"w",stdout);
printf("%d\n",sol.size());
FOR(sol)
printf("%d ",*it);
fclose(stdout);
}
int main()
{
citeste();
rezolva();
afiseaza();
return 0;
}