Pagini recente » Borderou de evaluare (job #2127462) | Cod sursa (job #1051210) | Cod sursa (job #2397873) | Borderou de evaluare (job #2071475) | Cod sursa (job #2602759)
#include <bits/stdc++.h>
#define pb push_back
#define node adjacent[x][i]
//Problema citrice sau cv de genu
//solutie_100p_din_prima_ez
using namespace std;
const int N=1005;
ifstream f("critice.in");
ofstream g("critice.out");
vector<int>adjacent[N];
int id[N][N];
int n,m,x,y,c,C[N][N],flow[N][N],mn;
int source=1,maxflow;
int inq[N],q[N],b,k,pre[N];
int cc[N];
int nr,ids[N*10];
void bfs(int x)
{
for(int i=1;i<=n;++i) inq[i]=0;
inq[x]=1; q[1]=x; b=0; k=1;
while(b<k)
{
++b;
x=q[b];
for(int i=0;i<adjacent[x].size();++i) if(!inq[node] && C[x][node]-flow[x][node]>0)
{
inq[node]=1;
q[++k]=node;
pre[node]=x;
}
}
}
void bravo9(int x)
{
if(x==source) return;
mn=min(mn,C[pre[x]][x]-flow[pre[x]][x]);
bravo9(pre[x]);
flow[pre[x]][x]+=mn;
flow[x][pre[x]]-=mn;
}
void Faci1000Fac1000BravoTieBravoMie(int x)
{
bool increase_flow=true;
while(increase_flow)
{
increase_flow=false;
bfs(1);
for(int i=0;i<adjacent[x].size();++i) if(inq[node] && C[node][x]-flow[node][x]>0)
{
mn=C[node][x]-flow[node][x];
bravo9(node);
flow[node][x]+=mn;
flow[x][node]-=mn;
if(mn) increase_flow=true;
maxflow+=mn;
}
}
}
void dfs_bolund(int x,int t)
{
cc[x]=t;
for(int i=0;i<adjacent[x].size();++i) if(!cc[node] && C[x][node] && C[x][node]-flow[x][node]>0)
{
dfs_bolund(node,t);
}
}
void dfs_invers(int x,int t)
{
cc[x]=t;
for(int i=0;i<adjacent[x].size();++i) if(!cc[node] && C[node][x] && C[node][x]-flow[node][x]>0)
{
dfs_invers(node,t);
}
}
void VitezaFerrari()
{
dfs_bolund(1,1);
dfs_invers(n,2);
for(int x=1;x<=n;++x)
{
for(int i=0;i<adjacent[x].size();++i)
{
if(cc[x]==1 && cc[node]==2 && C[x][node])
{
ids[id[x][node]]=1;
++nr;
}
}
}
}
int main()
{
f>>n>>m;
for(int i=1;i<=m;++i)
{
f>>x>>y>>c;
adjacent[x].pb(y);
adjacent[y].pb(x);
id[x][y]=i;
id[y][x]=i;
C[x][y]=c;
C[y][x]=c;
}
Faci1000Fac1000BravoTieBravoMie(n);
VitezaFerrari();
g<<nr<<'\n';
for(int i=1;i<=m;++i) if(ids[i]) g<<i<<'\n';
return 0;
}