Pagini recente » Cod sursa (job #2840194) | Cod sursa (job #2862450) | Cod sursa (job #1666011) | Cod sursa (job #216430) | Cod sursa (job #2652207)
#include <bits/stdc++.h>
#define oo 0x3f3f3f3f
#define muchie pair<int, int>
#define e1 first
#define e2 second
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
int n, m, x, y, cap, nr;
int C[1005][1005], TT[1005], C1[1005][1005];
vector<int> graf[1005], rez; bool viz[1005];
vector<muchie> muc;
vector<int> drumuri[1005];
void Read()
{
f>>n>>m;
for(int i = 1;i <= m;++i)
{
f>>x>>y>>cap;
graf[x].push_back(y); graf[y].push_back(x);
C[x][y] = C[y][x] = cap;
muc.push_back(make_pair(x, y));
}
}
bool bfs()
{
memset(viz, false, sizeof(viz));
viz[1] = true;
queue<int> q;
q.push(1);
while(!q.empty())
{
int nod = q.front();
q.pop();
if(nod == n) continue;
for(auto it : graf[nod])
{
if(viz[it] || C[nod][it] == 0) continue;
viz[it] = true;
q.push(it);
TT[it] = nod;
}
}
return viz[n];
}
void maximum_flow()
{
int fmin;
nr = 0;
for(;bfs();)
{
for(auto it : graf[n])
{
int nod = it;
if(C[nod][n] == 0 || !viz[nod]) continue;
TT[n] = nod;
fmin = oo;
for(nod = n; nod != 1;nod = TT[nod])
fmin = min(fmin, C[TT[nod]][nod]);
if(fmin == 0) continue;
for(nod = n;nod != 1;nod = TT[nod])
{
C[TT[nod]][nod] -= fmin;
C[nod][TT[nod]] += fmin;
}
++nr;
for(nod = n;nod != 1;nod = TT[nod])
drumuri[nr].push_back(nod);
drumuri[nr].push_back(1);
}
}
}
void Solve()
{
maximum_flow();
memset(viz, false, sizeof(viz));
int nr_max = 0;
for(int i = 1;i <= nr;++i)
{
muchie neck = make_pair(-1, -1);
nr_max = 0;
for(int j = 0;j < drumuri[i].size() - 1;++j)
if(!C[drumuri[i][j + 1]][drumuri[i][j]] || !C[drumuri[i][j]][drumuri[i][j + 1]])
{
++nr_max;
neck = make_pair(drumuri[i][j + 1], drumuri[i][j]);
}
else if(nr_max > 1)
break;
if(nr_max != 1)
continue;
if(find(muc.begin(), muc.end(), make_pair(neck.e1, neck.e2)) != muc.end())
nr_max = (find(muc.begin(), muc.end(), make_pair(neck.e1, neck.e2)) - muc.begin()) + 1;
else if(find(muc.begin(), muc.end(), make_pair(neck.e2, neck.e1)) != muc.end())
nr_max = (find(muc.begin(), muc.end(), make_pair(neck.e2, neck.e1)) - muc.begin()) + 1;
if(!viz[nr_max])
rez.push_back(nr_max), viz[nr_max] = true;
}
g<<rez.size()<<'\n';
for(auto it : rez)
g<<it<<'\n';
}
int main()
{
Read();
Solve();
return 0;
}