Pagini recente » Diferente pentru articole intre reviziile 39 si 40 | Diferente pentru runda/ddddd intre reviziile 2 si 1 | Atasamentele paginii Clasament boring_singlecup_2 | Istoria paginii utilizator/marius68 | Cod sursa (job #1068045)
#include <algorithm>
#include <fstream>
#include <bitset>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define PII pair<int, int>
#define x first
#define y second
using namespace std;
const int N=1003;
ifstream fin("critice.in");
ofstream fout("critice.out");
vector <int> g[N], sol;
bitset <N> v, v1;
PII mc[N*10];
int C[N][N], F[N][N], Tr[N];
int n, m, flow;
int bfs()
{
int x;
queue <int> Q;
v.reset();
v[1]=1;
Q.push(1);
for(;!Q.empty();Q.pop())
{
x=Q.front();
if(x==n) continue;
for(auto p: g[x])
{
if(C[x][p]==F[x][p]||v[p]) continue;
v[p]=1;
Tr[p]=x;
Q.push(p);
}
}
return v[n];
}
void dfs1(int x)
{
v[x]=1;
for(auto p: g[x])
{
if(!v[p]&&C[x][p]>F[x][p]) dfs1(p);
}
}
void dfs2(int x)
{
v1[x]=1;
for(auto p: g[x])
{
if(!v1[p]&&C[p][x]>F[p][x]) dfs2(p);
}
}
void get_flow()
{
int i, fmin;
while(bfs())
{
for(auto p: g[n])
{
if(C[p][n]==F[p][n]||!v[p]) continue;
Tr[n]=p;
fmin=INF;
for(i=n;i!=1;i=Tr[i])
{
fmin=min(fmin, C[Tr[i]][i]-F[Tr[i]][i]);
}
if(!fmin) continue;
for(i=n;i!=1;i=Tr[i])
{
F[Tr[i]][i]+=fmin;
F[i][Tr[i]]-=fmin;
}
flow+=fmin;
}
}
v.reset();
}
int main()
{
int i;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>mc[i].x>>mc[i].y;
g[mc[i].x].push_back(mc[i].y);
g[mc[i].y].push_back(mc[i].x);
fin>>C[mc[i].x][mc[i].y];
C[mc[i].y][mc[i].x]=C[mc[i].x][mc[i].y];
}
get_flow();
dfs1(1);
dfs2(n);
for(i=1;i<=m;i++)
{
if(v[mc[i].x]&&v1[mc[i].y]&&F[mc[i].x][mc[i].y]==C[mc[i].x][mc[i].y]) sol.push_back(i);
else if(v1[mc[i].x]&&v[mc[i].y]&&F[mc[i].y][mc[i].x]==C[mc[i].x][mc[i].y]) sol.push_back(i);
}
fout<<sol.size()<<"\n";
for(auto p: sol) fout<<p<<"\n";
//fout<<F[2][1]<<" "<<F[1][2]<<" "<<C[2][1];
fin.close();
fout.close();
}