Pagini recente » Cod sursa (job #1857625) | Cod sursa (job #1213233) | Cod sursa (job #2137358) | Cod sursa (job #2290579) | Cod sursa (job #2600892)
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <climits>
#include <queue>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
vector <int> g[1001];
vector <int> sol;
queue <int> q;
int f[1001][1001],c[1001][1001];
int tata[1001];
bool viz[1001],viz1[1001];
int n,m;
struct muchii
{
int x,y,c;
}v[10001];
bool bfs(int start)
{
q.empty();
for(int i=1;i<=n;i++)
tata[i]=viz[i]=0;
viz[start]=1;
q.push(start);
while(!q.empty())
{
int nod=q.front();
q.pop();
for(int i=0;i<g[nod].size();i++)
{
int nou=g[nod][i];
if(viz[nou]==0&&c[nod][nou]>f[nod][nou])
{
viz[nou]=1;
q.push(nou);
tata[nou]=nod;
}
}
}
return viz[n];
}
void bfs1()
{
viz1[n]=1;
q.empty();
q.push(n);
while(!q.empty())
{
int nod=q.front();
q.pop();
for(int i=0;i<g[nod].size();i++)
{
int nou=g[nod][i];
if(viz1[nou]==0)
{
viz1[nou]=1;
q.push(nou);
}
}
}
}
int minim(int nod)
{
int Min=c[nod][n]-f[nod][n];
while(nod!=1)
{
int nou=tata[nod];
Min=min(Min,c[nou][nod]-f[nou][nod]);
nod=nou;
}
return Min;
}
void add(int val, int nod)
{
f[nod][n]+=val;
f[n][nod]-=val;
while(nod!=1)
{
int nou=tata[nod];
f[nou][nod]+=val;
f[nod][nou]-=val;
nod=nou;
}
}
void flux()
{
while(bfs(1))
for(int i=0;i<g[n].size();i++)
{
int nod=g[n][i];
if(c[nod][n]==f[nod][n]||viz[nod]==0)
continue;
int qmin=minim(nod);
add(qmin,nod);
}
}
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,ct;
fin>>x>>y>>ct;
v[i]={x,y,ct};
g[x].push_back(y);
g[y].push_back(x);
c[x][y]=c[y][x]=ct;
}
flux();
bfs1();
for(int i=1;i<=m;i++)
{
int x=v[i].x;
int y=v[i].y;
if(viz[x]==1&&viz1[y]==1||viz1[x]==1&&viz[y]==1)
sol.push_back(i);
}
fout<<sol.size()<<'\n';
for(int i=0;i<sol.size();i++)
fout<<sol[i]<<'\n';
return 0;
}