Pagini recente » Borderou de evaluare (job #1845172) | Borderou de evaluare (job #3314808) | Borderou de evaluare (job #3328389) | Borderou de evaluare (job #3350053) | Cod sursa (job #3348331)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <sstream>
#include <string>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n, m;
struct edges{
int to;
int maxf;
int used;
int rev;
int ind;
};
vector<vector<edges > > v;
vector<int> level, ptr;
void add_edge(int a, int b, int c, int ind)
{
v[a].push_back({b,c,0,v[b].size(), ind});
v[b].push_back({a,c,0,v[a].size()-1, ind});
}
bool bfs(int start, int fin)
{
fill(level.begin(), level.end(), -1);
level[start]= 0;
queue<int> q;
q.push(start);
while(!q.empty())
{
int nod = q.front();
q.pop();
for(int i = 0; i<v[nod].size();i++)
{
int vecin = v[nod][i].to;
int maxf = v[nod][i].maxf;
int used = v[nod][i].used;
if(maxf - used > 0 && level[vecin] == -1)
{
level[vecin] = level[nod] + 1;
q.push(vecin);
}
}
}
return level[fin] != -1;
}
int dfs(int nod, int fin, int c)
{
if(nod == fin || c == 0) return c;
for(int &i = ptr[nod]; i<v[nod].size(); i++)
{
int vecin = v[nod][i].to;
int maxf = v[nod][i].maxf;
int used = v[nod][i].used;
if(maxf-used == 0 || level[vecin] != level[nod] + 1)
continue;
int cp = dfs(vecin, fin, min(c, maxf-used));
if(cp == 0) continue;
v[nod][i].used+=cp;
v[vecin][v[nod][i].rev].used -= cp;
return cp;
}
level[nod] = -1;
return 0;
}
int viz[100001], ans1[100001];
int main()
{
fin >> n >> m;
v.resize(n+ 5);
level.resize(n + 5);
ptr.resize(n + 5);
for(int i = 1; i<=m; i++)
{
int a, b, c;
fin >> a >> b >> c;
add_edge(a, b, c, i);
}
int ans = 0;
while(bfs(1,n))
{
fill(ptr.begin(), ptr.end(), 0);
int pushed = 0;
while(pushed = dfs(1,n,1e7))
{
ans+=pushed;
}
}
queue<int> q;
q.push(1);
viz[1] = 1;
while(!q.empty())
{
int nod = q.front(); q.pop();
for(int i = 0; i<v[nod].size(); i++)
{
int vecin = v[nod][i].to;
if(viz[vecin] == 0 && v[nod][i].maxf-v[nod][i].used > 0)
{
viz[vecin] = 1;
q.push(vecin);
}
}
}
int z = 0;
for(int i = 1; i<=n; i++)
{
if(viz[i] == 1)
for(int j = 0; j<v[i].size(); j++)
{
if(viz[v[i][j].to] == 0)
{
ans1[++z] = v[i][j].ind;
}
}
}
fout << z << '\n';
for(int i = 1; i<=z; i++)
{
fout << ans1[i] << '\n';
}
return 0;
}