Pagini recente » Cod sursa (job #1601733) | Cod sursa (job #1835351) | Cod sursa (job #1094719) | Cod sursa (job #224933) | Cod sursa (job #1023907)
/**
* Muchiile critice sunt muchiile saturate care sunt accesibile din sursa si din destinatie doar pe muchii nesaturate ;)
*
*/
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <utility>
#include <cstring>
#include <string>
#include <stack>
#include <deque>
#include <iomanip>
#include <set>
#include <map>
#include <cassert>
#include <ctime>
#include <list>
#include <iomanip>
using namespace std;
string file = "critice";
ifstream cin( (file + ".in").c_str() );
ofstream cout( (file + ".out").c_str() );
const int MAXN = 1005;
const int MAXM = 10005;
const int oo = 0x3f3f3f3f;
typedef vector<int> Graph[MAXN];
typedef vector<int> :: iterator It;
const inline int min(const int &a, const int &b) { if( a > b ) return b; return a; }
const inline int mabs(const int a) { if( a > 0 ) return a; return -a; }
const inline int max(const int &a, const int &b) { if( a < b ) return b; return a; }
const inline void Get_min(int &a, const int b) { if( a > b ) a = b; }
const inline void Get_max(int &a, const int b) { if( a < b ) a = b; }
struct ClassComp {
inline bool operator () (const int &a, const int &b) const {
return a > b;
}
};
int N, M, Father[MAXN], C[MAXN][MAXN], F[MAXN][MAXN];
Graph G;
vector<pair<int, int> > Edge;
queue <int> Q, Critics;
bitset <MAXN> Vis, Source, Sink;
inline bool BFs() {
int Node = 1;
Vis.reset();
for(Q.push(Node), Vis[Node] = true ; !Q.empty() ; Q.pop(), Node = Q.front())
for(It it = G[Node].begin(), fin = G[Node].end(); it != fin ; ++ it)
if(!Vis[*it] && C[Node][*it] != F[Node][*it])
Vis[*it] = true, Q.push(*it), Father[*it] = Node;
return Vis[N];
}
inline void BFs(int Node, bitset <MAXN> & Viz) {
for(Q.push(Node), Viz[Node] = true ; !Q.empty() ; Q.pop(), Node = Q.front())
for(It it = G[Node].begin(), fin = G[Node].end(); it != fin ; ++ it)
if(!Viz[*it] && C[Node][*it] != mabs(F[Node][*it]) )
Viz[*it] = true, Q.push(*it), Father[*it] = Node;
}
int main() {
cin >> N >> M;
for(int i = 1 ; i <= M ; ++ i) {
int x, y, z;
cin >> x >> y >> z;
Edge.push_back(make_pair(x, y));
G[x].push_back(y);
G[y].push_back(x);
C[x][y] = z;
C[y][x] = z;
}
for( ; BFs() ; )
for(It it = G[N].begin(), fin = G[N].end(); it != fin ; ++ it) {
int Node = *it;
if(C[Node][N] == F[Node][N] || !Vis[N])
continue;
int minFlow = oo;
for(int i = N ; i != 1 ; i = Father[i])
minFlow = min(minFlow, C[Father[i]][i] - F[Father[i]][i]);
for(int i = N ; i != 1 ; i = Father[i])
F[Father[i]][i] += minFlow,
F[i][Father[i]] -= minFlow;
}
BFs(1, Source);
BFs(N, Sink);
for(int i = 0 ; i < Edge.size() ; ++ i) {
int x = Edge[i].first;
int y = Edge[i].second;
if(C[x][y] == F[x][y] || C[y][x] == F[y][x])
if((Source[x] && Sink[y]) || (Source[y] && Sink[x]))
Critics.push(i + 1);
}
for( cout << Critics.size() << '\n' ; !Critics.empty() ; Critics.pop() )
cout << Critics.front() << '\n';
cin.close();
cout.close();
return 0;
}