Pagini recente » Cod sursa (job #2610545) | Cod sursa (job #1639970) | Cod sursa (job #1304067) | Cod sursa (job #2303658) | Cod sursa (job #2681396)
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pf push_front
#define nmax 100005
#define inf 1000000000
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
int n,m;
vector<int> adj[1005];
int cap[1005][1005],tata[1005],flow;
bool viz1[1005],viz2[1005];
pair<int,int> edge[10005];
bool bfs(int node)
{
vector<bool> viz(n+5,0);
viz[1]=1;
queue<int> q;
q.push(1);
while(!q.empty())
{
int crt=q.front();
q.pop();
for(auto x:adj[crt])
{
if(viz[x]==0&&cap[crt][x]>0)
{
viz[x]=1;
// if(x==n) return 1;
q.push(x);
tata[x]=crt;
if(x==n) return 1;
}
}
}
return 0;
}
void dfs1(int node)
{
viz1[node]=1;
for(auto x:adj[node])
{
if(cap[node][x]>0&&viz1[x]==0)
{
viz1[x]=1;
dfs1(x);
}
}
}
void dfs2(int node)
{
viz2[node]=1;
for(auto x:adj[node])
{
if(cap[node][x]>0&&viz2[x]==0)
{
viz2[x]=1;
dfs2(x);
}
}
}
int flux(int node,int flw)
{
while(node!=1)
{
flw=min(flw,cap[tata[node]][node]);
node=tata[node];
}
node=n;
while(node!=1)
{
cap[tata[node]][node]-=flw;
cap[node][tata[node]]+=flw;
node=tata[node];
}
return flw;
}
int main()
{
f>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,c;
f>>x>>y>>c;
cap[x][y]=c;
adj[x].pb(y);
adj[y].pb(x);
edge[i]={x,y};
cap[y][x]=c;
}
while(bfs(1))
{
flow+=flux(n,1e9);
}
dfs1(1);
dfs2(n);
vector<int> sol;
for(int i=1;i<=m;i++)
{
int x=edge[i].first,y=edge[i].second;
if(viz1[x]==1&&viz2[y]==1&&cap[x][y]==0)
{
sol.pb(i);
}
else
{
if(viz1[y]==1&&viz2[x]==1&&cap[y][x]==0)
{
sol.pb(i);
}
}
}
g<<sol.size()<<'\n';
for(int i=0;i<sol.size();i++) g<<sol[i]<<'\n';
}