Pagini recente » Monitorul de evaluare | Cod sursa (job #3265413) | Clasament fmi-no-stress-4 | Borderou de evaluare (job #2783169) | Cod sursa (job #3274108)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
int n, m, ok, ans;
vector<pair<int, int>> v[1005];
pair<int, int> muc[20005];
int viz[1005];
vector<int> st;
int INF = (1 << 30);
void dfs(int nod, int flux, int cmin)
{
viz[nod] = 1;
if(nod == n)
{
ok = 1;
for(auto it: st)
{
if(it <= m)
{
muc[it].first += flux;
muc[it + m].first -= flux;
}
else
{
muc[it].first += flux;
muc[it - m].first -= flux;
}
}
return;
}
for(auto it: v[nod])
{
if(viz[it.first] == 0 && muc[it.second].second - muc[it.second].first >= cmin)
{
st.push_back(it.second);
dfs(it.first, min(flux, muc[it.second].second - muc[it.second].first), cmin);
st.pop_back();
}
}
}
void dfs2(int nod)
{
viz[nod] = 1;
for(auto it: v[nod])
{
if(viz[it.first] == 0 && muc[it.second].second - muc[it.second].first > 0)
{
dfs2(it.first);
}
}
}
int main()
{
in>>n>>m;
int x, y, z;
int cmax = 0;
for(int i = 1; i<=m; i++)
{
in>>x>>y>>z;
v[x].push_back({y, i});
muc[i] = {0, z};
v[y].push_back({x, i + m});
muc[i + m] = {0, z};
cmax = max(cmax, z);
}
for(int i = cmax; i>=1; i /= 2)
{
ok = 1;
while(ok == 1)
{
ok = 0;
for(int j = 1; j<=n; j++)
{
viz[j] = 0;
}
st.clear();
dfs(1, INF, i);
}
}
for(int i = 1; i<=n; i++)
{
viz[i] = 0;
}
dfs2(1);
for(int i = 1; i<=n; i++)
{
if(viz[i] == 1)
{
for(auto it: v[i])
{
if(viz[it.first] == 0)
{
ans++;
}
}
}
}
out<<ans<<'\n';
for(int i = 1; i<=n; i++)
{
if(viz[i] == 1)
{
for(auto it: v[i])
{
if(viz[it.first] == 0)
{
if(it.second <= m)
{
out<<it.second<<'\n';
}
else
{
out<<it.second - m<<'\n';
}
}
}
}
}
return 0;
}