Pagini recente » Cod sursa (job #3290129) | Cod sursa (job #1680514) | Cod sursa (job #1985784) | Cod sursa (job #2236848) | Cod sursa (job #1679200)
#include <fstream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <iomanip>
#define NMax 1005
#define INF 0x3f3f3f3f
using namespace std;
ifstream t("critice.in");
ofstream g("critice.out");
struct muchie{
int x,y;
}M[NMax * 10];
int n,m,x,y,w,F,nr;
int VIZ[NMax],tata[NMax],viz[NMax],vizu[NMax],vizd[NMax];
int c[NMax][NMax],f[NMax][NMax];
vector<pair<int,int> > G[NMax];
vector<int> sol;
queue<int> q;
int bfs(){
memset(viz,0,sizeof(viz));
while(!q.empty())
q.pop();
q.push(1);
viz[1] = 1;
tata[1] = 0;
while(!q.empty()){
int nod = q.front();
q.pop();
for(int i = 0; i < G[nod].size(); ++i){
int V = G[nod][i].first;
if(!viz[V] && c[nod][V] != f[nod][V]){
viz[V] = 1;
q.push(V);
tata[V] = nod;
if(V == n)
return 1;
}
}
}
return 0;
/* while(!q.empty())
q.pop(); */
}
void bfs(int k,int viz[NMax]){
q.push(k);
viz[k] = 1;
while(!q.empty()){
int nod = q.front();
q.pop();
for(int i = 0; i < G[nod].size(); ++i){
int V = G[nod][i].first;
if(!viz[V] && c[nod][V] != f[nod][V] && c[V][nod] != f[V][nod]){
viz[V] = 1;
q.push(V);
}
}
}
}
int main()
{
t >> n >> m;
for(int i = 1; i <= m; ++i){
t >> x >> y >> w;
c[x][y] = w;
c[y][x] = w;
G[x].push_back(make_pair(y,w));
G[y].push_back(make_pair(x,w));
M[++nr].x = x;
M[nr].y = y;
}
while(bfs()){
int fm = INF;
for(int nod = n; nod != 1; nod = tata[nod]){
fm = min(fm, c[tata[nod]][nod] - f[tata[nod]][nod]);
}
for(int nod = n; nod != 1; nod = tata[nod]){
f[tata[nod]][nod] += fm;
f[nod][tata[nod]] -= fm;
}
F += fm;
}
bfs(1,vizu);
bfs(n,vizd);
for(int i = 1; i <= nr; ++i){
if((vizu[M[i].x] == 1 && vizd[M[i].y] == 1) || (vizu[M[i].y] == 1 && vizd[M[i].x] == 1)){
sol.push_back(i);
}
}
g << sol.size() << '\n';
for(int i = 0; i < sol.size(); ++i){
g << sol[i] << '\n';
}
// g << F;
return 0;
}