Pagini recente » Cod sursa (job #786410) | Cod sursa (job #380782) | Cod sursa (job #407521) | Cod sursa (job #741002) | Cod sursa (job #318506)
Cod sursa(job #318506)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int N_MAX = 1000;
const int INF = 0x3f3f3f3f;
int n,m;
vector<int> G[N_MAX];
vector< pair<int,int> > muchii;
int cap[N_MAX][N_MAX], fx[N_MAX][N_MAX];
int up[N_MAX];
bool fw[N_MAX];
bool used[N_MAX], dinRad[N_MAX], dinN[N_MAX];
bool BF() {
queue<int> Q;
int cur;
fill(used,used+n,0);
up[0] = -1;
used[0] = true;
for (Q.push(0); !Q.empty(); Q.pop()) {
cur = Q.front();
for (vector<int>::iterator next = G[cur].begin(); next != G[cur].end(); ++next) {
if (!used[*next] && cap[cur][*next] - fx[cur][*next] > 0) {
Q.push(*next);
up[*next] = cur;
fw[*next] = true;
if (*next == n-1)
return true;
else
used[*next] = true;
}
if (!used[*next] && fx[*next][cur] > 0) {
Q.push(*next);
up[*next] = cur;
fw[*next] = false;
if (*next == n-1)
return true;
else
used[*next] = true;
}
}
}
return false;
}
int flux() {
int flow = 0;
while (BF()) {
int min = INF;
for (int nod = n-1; nod; nod = up[nod]) {
if (fw[nod]) {
int muchie = cap[up[nod]][nod] - fx[up[nod]][nod];
if (min > muchie)
min = muchie;
} else {
int muchie = fx[up[nod]][nod];
if (min > muchie)
min = muchie;
}
}
for (int nod = n-1; nod; nod = up[nod]) {
if (fw[nod])
fx[up[nod]][nod] += min;
else
fx[up[nod]][nod] -= min;
}
flow += min;
}
return flow;
}
void reach ( bool used[] ) {
queue<int> Q;
fill(used,used+n,false);
for (Q.push(0), used[0] = true; !Q.empty(); Q.pop()) {
int cur = Q.front();
for (vector<int>::iterator next = G[cur].begin(); next != G[cur].end(); ++next) {
if (!used[*next] && cap[cur][*next] - fx[cur][*next] > 0) {
used[*next] = true;
Q.push(*next);
}
if (!used[*next] && fx[*next][cur] > 0) {
used[*next] = true;
Q.push(*next);
}
}
}
}
void reach2 ( bool used[] ) {
queue<int> Q;
fill(used,used+n,false);
for (Q.push(n-1), used[n-1] = true; !Q.empty(); Q.pop()) {
int cur = Q.front();
for (vector<int>::iterator next = G[cur].begin(); next != G[cur].end(); ++next) {
if (!used[*next] && cap[*next][cur] - fx[*next][cur] > 0) {
used[*next] = true;
Q.push(*next);
}
if (!used[*next] && fx[cur][*next] > 0) {
used[*next] = true;
Q.push(*next);
}
}
}
}
int main() {
freopen("critice.in","rt",stdin);
freopen("critice.out","wt",stdout);
scanf("%d %d",&n,&m);
for (int i = 0, a,b,c; i < m; ++i) {
scanf("%d %d %d",&a,&b,&c);
--a; --b;
G[a].push_back(b);
G[b].push_back(a);
cap[a][b] = c;
cap[b][a] = c;
muchii.push_back(make_pair(a,b));
}
flux();
// printf("%d\n",F);
reach(dinRad);
reach2(dinN);
vector<int> sol;
for (int i = 0; i < m; ++i) {
int a = muchii[i].first, b = muchii[i].second;
if (dinRad[a] && dinN[b] && cap[a][b] == fx[a][b] || dinRad[b] && dinN[a] && cap[a][b] == fx[b][a])
sol.push_back(i+1);
}
printf("%d\n",sol.size());
for (unsigned int i = 0; i < sol.size(); ++i) printf("%d\n",sol[i]);
return 0;
}