Pagini recente » Cod sursa (job #2921152) | Cod sursa (job #726945) | Cod sursa (job #1299866) | Cod sursa (job #375302) | Cod sursa (job #1194464)
#include <fstream>
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int N = 1 + 1e3, M = 1 + 1e4, inf = 0x3f3f3f3f;
struct Edge{
int x, y;
};
int cap[N][N], flux[N][N], T[N], n, nrE;
bool use[N], reachS[N], reachD[N];
Edge E[M];
void scrie(){
for (int i = 1 ; i <= n ; i++){
for (int j = 1 ; j <= n ; j++)
cout << flux[i][j] << " / " << cap[i][j] << '\t';
cout << '\n';
}
}
bool bfs(int x, int D){
queue<int> Q;
memset(use, false, sizeof(use));
Q.push(x);
use[x] = true;
while (!Q.empty()){
x = Q.front();
Q.pop();
if (x == D)
return true;
for (int i = 1 ; i <= n ; i++)
if (!use[i] && flux[x][i] < cap[x][i]){
use[i] = true;
T[i] = x;
Q.push(i);
}
}
return false;
}
void maxFlow(int S, int D){
while (bfs(S, D)){
int amount = inf;
for (int i = D ; i != S ; i = T[i])
amount = min(amount, cap[ T[i] ][i] - flux[ T[i] ][i]);
for (int i = D ; i != S ; i = T[i]){
flux[ T[i] ][i] += amount;
flux[i][ T[i] ] -= amount;
}
}
memcpy(reachS, use, sizeof(use));
for (int i = 1 ; i <= n ; i++)
reachD[i] = bfs(i, D);
}
inline bool critEdge(Edge E){
return ( reachS[ E.x ] && reachD[ E.y ] ) || ( reachD[ E.x ] && reachS[ E.y ] );
}
void read(const char* fin){
ifstream in(fin);
int C;
in >> n >> nrE;
for (int i = 1 ; i <= nrE ; i++){
in >> E[i].x >> E[i].y >> C;
cap[ E[i].x ][ E[i].y ] = cap[ E[i].y ][ E[i].x ] = C;
}
in.close();
}
void print(const char* fout){
int cnt = 0;
for (int i = 1 ; i <= nrE ; i++)
cnt += critEdge( E[i] );
ofstream out(fout);
out << cnt << '\n';
for (int i = 1 ; i <= n ; i++)
if ( critEdge( E[i] ) )
out << i << '\n';
out.close();
}
int main(){
read("critice.in");
maxFlow(1, n);
print("critice.out");
return 0;
}