Pagini recente » Cod sursa (job #2220445) | Cod sursa (job #1512006) | Cod sursa (job #2637592) | Cod sursa (job #1990755) | Cod sursa (job #2695587)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int c[1003][1003], f[1003][1003];
int tata[1003];
int v[1003];
int vs[1003];
int vd[1003];
vector<int> rez;
int n,s,d,m;
int muchii[1005][1005];
bool bfs(vector<int> arce[] )
{
for(int i=1; i<=n; i++)
{
tata[i]=0;
v[i]=0;
}
queue<int> q;
q.push(s);
v[s]=1;
while(q.empty()==false)
{
int i = q.front();
q.pop();
for(auto j : arce[i])
{
if(v[j]==0&&c[i][j]-f[i][j]>0)
{
q.push(j);
tata[j] = i;
v[j] = 1;
if(j==d)
return true;
}
}
}
return false;
}
void dfs1(int nod,vector<int> arce[])
{
vs[nod]=1;
for(auto j: arce[nod])
if(vs[j]==0&&c[nod][j]>f[nod][j])
dfs1(j,arce);
}
void dfs2(int nod,vector<int> arce[])
{
vd[nod]=1;
for(auto j: arce[nod])
if(vd[j]==0&&c[nod][j]>f[nod][j]&&c[nod][j]>f[j][nod])
dfs2(j,arce);
}
int main()
{
fin>>n>>m;
vector<int> arce[n+1];
for(int i=1; i<=m; i++)
{
int a1,b1,c1;
fin>>a1>>b1>>c1;
arce[a1].push_back(b1);
arce[b1].push_back(a1);
c[a1][b1]=c1;
c[b1][a1]=c1;
muchii[a1][b1] = i;
muchii [b1][a1] = i;
}
s=1;
d=n;
long long flux=0;
while(bfs(arce)==true)
{
for(auto nod : arce[d])
if(f[nod][d] != c[nod][d] && v[nod])
{
tata[d]=nod;
int flux_lant=INT_MAX;
int i=d;
while(i!=s)
{
int j=tata[i];
flux_lant=min(flux_lant, c[j][i]-f[j][i]);
i=j;
}
i=d;
while(i!=s)
{
int j=tata[i];
f[j][i]+=flux_lant;
f[i][j]-=flux_lant;
i=j;
}
flux+=flux_lant;
}
}
dfs1(1,arce);
dfs2(n,arce);
for(int i=1;i<=n; i++)
for(int j=1;j<n;j++)
if(f[i][j]==c[i][j]&&c[i][j]>0)
if((vs[i]==1&&vd[j]==1)||(vs[j]==1&&vd[i]==1))
rez.push_back(muchii[i][j]);
fout<<rez.size()<<"\n";
for(auto it:rez)
{
fout<<it<<"\n";
}
return 0;
}