Pagini recente » Cod sursa (job #1553158) | Cod sursa (job #2972151) | Cod sursa (job #836000) | Cod sursa (job #2130772) | Cod sursa (job #1980232)
#include<bits/stdc++.h>
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
const int NMAX = 1005;
int N,M,c[NMAX][NMAX],f[NMAX][NMAX],viz[NMAX],pr[NMAX],ind[NMAX][NMAX],viz2[NMAX],viz1[NMAX];
vector<int> v[NMAX],sol;
void read()
{
in>>N>>M;
int x,y,z;
for(int i = 1 ; i <= M ; ++i){
in>>x>>y>>z;
c[x][y] += z;
c[y][x] += z;
ind[x][y] = ind[y][x] = i;
v[x].push_back(y);
v[y].push_back(x);
}
}
void reset()
{
for(int i = 1 ;i <= N ; ++i)
viz[i] = 0;
}
int bfs()
{
reset();
queue<int> Q;
Q.push(1);
viz[1] = 1;
while(!Q.empty())
{
int virf = Q.front();
Q.pop();
for(int i = 0 ; i < v[virf].size() ; ++i){
int now = v[virf][i];
if(viz[now] || c[virf][now] == f[virf][now])
continue;
pr[now] = virf;
viz[now] = 1;
Q.push(now);
}
}
return viz[N];
}
void max_flow()
{
while(bfs()){
for(int i = 0 ; i < v[N].size() ; ++i){
if(!viz[v[N][i]] || c[v[N][i]][N] == f[v[N][i]][N])
continue;
pr[N] = v[N][i];
int minim = 1 << 30;
for(int act = N ; act != 1 ; act = pr[act])
minim = min(minim,c[pr[act]][act] - f[pr[act]][act]);
for(int act = N ; act != 1 ; act = pr[act]){
c[pr[act]][act] += minim;
c[act][pr[act]] -= minim;
}
}
}
}
void bfs2(int nod,int viz[])
{
queue<int> Q;
Q.push(nod);
viz[nod] = 1;
while(!Q.empty()){
int virf = Q.front();
Q.pop();
for(int i = 0 ; i < v[virf].size() ; ++i){
int now = v[virf][i];
if(viz[now] || c[virf][now] == f[virf][now])
continue;
viz[now] = 1;
Q.push(now);
}
}
}
void solve()
{
bfs2(1,viz1);
bfs2(N,viz2);
for(int i = 1 ; i <= N ; ++i)
for(int j = 0 ; j < v[i].size() ; ++j)
if(c[i][v[i][j]] == f[i][v[i][j]])
if((viz1[i] && viz2[v[i][j]]) || (viz2[i] && viz1[v[i][j]]))
sol.push_back(ind[i][v[i][j]]);
sort(sol.begin(),sol.end());
for(int i = 0 ; i < sol.size() - 1 ; ++i)
if(sol[i] == sol[i] + 1)
sol.erase(sol.begin() + i);
out<<sol.size()<<"\n";
for(int i = 0 ;i < sol.size() ;++i)
out<<sol[i]<<"\n";
out.close();
}
int main()
{
read();
max_flow();
solve();
return 0;
}