Pagini recente » Cod sursa (job #387426) | Cod sursa (job #1677571) | Cod sursa (job #2218703) | Cod sursa (job #826420) | Cod sursa (job #1026828)
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <bitset>
#define MAXN 1003
#define INF 100000
using namespace std;
int n,m,s,t,f;
int parent[MAXN],a[MAXN][MAXN];
vector<int> G[MAXN];
vector<int> indexG[MAXN];
int viz[MAXN];
void augment_path(int u,int max_edge){
if(u==s) f= max_edge;
else{
augment_path(parent[u], min(max_edge,a[parent[u]][u]));
a[parent[u]][u]-=f;
a[u][parent[u]]+=f;
}
}
void DFS1(int u) {
viz[u] = 1;
for(int i=0;i<G[u].size();i++) {
if(a[u][G[u][i]]>0 && !viz[G[u][i]]) {
DFS1(G[u][i]);
}
}
}
void DFS2(int u) {
viz[u] = 2;
for(int i=0;i<G[u].size();i++) {
if(a[G[u][i]][u]>0 && !viz[G[u][i]]) {
DFS2(G[u][i]);
}
}
}
int main(){
int x,y,c;
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
cin>>n>>m;
s=1;t=n;
for(int i=0;i<m;i++) {
cin>>x>>y>>c;
a[x][y] = c;
a[y][x] = c;
G[x].push_back(y);
G[y].push_back(x);
indexG[x].push_back(i+1);
indexG[y].push_back(i+1);
}
while(true) {
queue<int> q;q.push(s);
bitset<MAXN> viz;
viz.reset();
viz[s] = true;
while(!q.empty()) {
int u = q.front();q.pop();
if(u==t) break;
for(int i=0;i<G[u].size();i++) {
int v = G[u][i];
if(!viz[v] && a[u][v]>0) {
viz[v] = true;
parent[v] = u;
q.push(v);
}
}
}
if(!viz[t]) break;
for(int i=0;i<G[t].size();i++) {
int v= G[t][i];
if(viz[v] && a[v][t]>0) {
parent[t] = v;
augment_path(t,INF);
}
}
}
DFS1(s);
DFS2(t);
vector<int> ans;
for(int i=1;i<=n;i++){
for(int j=0;j<G[i].size();j++) {
int v = G[i][j];
if(a[i][v] == 0 && viz[i] && viz [v] && viz[i]!=viz[v]) {
ans.push_back(indexG[i][j]);
}
}
}
sort(ans.begin(),ans.end());
cout<<ans.size()<<"\n";
for(int i=0;i<ans.size();i++) {
cout<<ans[i]<<"\n";
}
return 0;
}