Pagini recente » Cod sursa (job #2990199) | Cod sursa (job #722005) | Cod sursa (job #1516832) | Cod sursa (job #2196500) | Cod sursa (job #2939414)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
///#include <tryhardmode>
///#include <GOMDODE::ON>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
const int NMAX=1e3+5;
const int MAXVAL=1e9;
vector<int>v[NMAX];
vector<pair<int,int>>v2;
int crit[NMAX][NMAX];
int flux[NMAX][NMAX];
int total[NMAX];
int t[NMAX];
bool viz[NMAX];
int n;
int kon;
void dfs(int p)
{
viz[p]=1;
for(auto i:v[p])
{
if(!viz[i])
{
if(flux[p][i]==0 || flux[i][p]==0)
{
crit[p][i]++;
crit[i][p]++;
}
else
dfs(i);
}
}
}
bool bfs(int p)
{
int i;
queue<int>q;
for(i=1;i<=n;i++)
{
t[i]=0;
viz[i]=0;
}
q.push(1);
viz[1]=true;
while(!q.empty())
{
p=q.front();
q.pop();
if(p==n)
return true;
for(auto i:v[p])
{
if(!viz[i] && flux[p][i]>0)
{
q.push(i);
viz[i]=1;
t[i]=p;
}
}
}
return false;
}
void solve_n_reset()
{
int i;
for(i=1;i<=n;i++)
viz[i]=0;
dfs(1);
for(i=1;i<=n;i++)
viz[i]=0;
dfs(n);
}
int main()
{
int i,j,m,a,b,c,minim,x;
long long maxim=0;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>a>>b>>c;
v2.push_back(make_pair(a,b));
flux[a][b]=c;
flux[b][a]=c;
v[a].push_back(b);
v[b].push_back(a);
}
while(bfs(1))
{
for(auto i:v[n])
{
if(!viz[i])
continue;
if(flux[i][n]<=0)
continue;
minim=MAXVAL;
t[n]=i;
x=n;
while(x!=1)
{
minim=min(minim,flux[t[x]][x]);
x=t[x];
}
if(minim==0)
continue;
maxim=maxim+minim;
x=n;
while(x!=1)
{
flux[x][t[x]]=flux[x][t[x]]+minim;
flux[t[x]][x]=flux[t[x]][x]-minim;
x=t[x];
}
}
}
solve_n_reset();
for(i=0;i<v2.size();i++)
if(crit[v2[i].first][v2[i].second]>1)
total[++kon]=i+1;
fout<<kon<<"\n";
for(i=1;i<=kon;i++)
fout<<total[i]<<"\n";
return 0;
}