Pagini recente » Cod sursa (job #96573) | Monitorul de evaluare | Cod sursa (job #2701997) | Cod sursa (job #2535772) | Cod sursa (job #715455)
Cod sursa(job #715455)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#include <cstdlib>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
const int NMAX = 1005;
int F[NMAX][NMAX] , C[NMAX][NMAX] , T[NMAX] , use[NMAX] , N , M;
vector<int> G[NMAX] , ans;
bitset<NMAX> vis;
vector< pair<int,int> > edges;
void read_data()
{
fin>>N>>M;
for(int x , y , c , i = 1;i <= M;++i)
{
fin>>x>>y>>c;
G[x].push_back(y);
G[y].push_back(x);
edges.push_back(make_pair(x,y));
C[x][y] = C[y][x] = c;
}
}
bool bfs()
{
queue<int> Q;
for(int i = 1;i <= N;++i) T[i] = -1 , vis[i] = false;
for(Q.push(1) , vis[1] = 1;!Q.empty();)
{
int v = Q.front(); Q.pop();
for(vector<int>::const_iterator w = G[v].begin();w != G[v].end();++w)
if(vis[*w] == 0 && C[v][*w] > F[v][*w])
{
vis[*w] = 1;
T[*w] = v;
Q.push(*w);
}
}
return vis[N];
}
void bf_r(const int &S,const int &nr)
{
queue<int> Q;
for(Q.push(S) , use[S] = nr;!Q.empty();)
{
int v = Q.front(); Q.pop();
for(vector<int>::const_iterator w = G[v].begin();w != G[v].end();++w)
if(!use[*w] && C[v][*w] > abs(F[v][*w]))
{
use[*w] = nr;
Q.push(*w);
}
}
}
void flow()
{
for(;bfs();)
for(vector<int>::const_iterator w = G[N].begin();w != G[N].end();++w)
{
if(!vis[*w] || C[*w][N] == F[*w][N]) continue;
int fmin = int(1e9);
for(int node = N;node != 1;node = T[node])
fmin = min(fmin,C[T[node]][node] - F[T[node]][node]);
if(!fmin) continue;
for(int node = N;node != 1;node = T[node])
F[node][T[node]]-=fmin , F[T[node]][node]+=fmin;
}
}
int main()
{
read_data();
flow();
bf_r(1,1);
bf_r(N,2);
for(int i = 0;i < M;++i)
if(use[edges[i].first] + use[edges[i].second] == 3)
ans.push_back(i + 1);
fout<<ans.size()<<'\n';
for(int i = 0;i < (int)ans.size();++i)
fout<<ans[i]<<'\n';
return 0;
}