Pagini recente » Cod sursa (job #968596) | Cod sursa (job #2277758)
#include<fstream>
#include<iostream>
#include<vector>
#include<queue>
#define DN 1005
#define x first
#define y second
#define pb push_back
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n,m,a,b,c,cap[DN][DN],viz[DN],pr[DN],f[DN][DN],pr2[DN];
int r[10*DN],nod,fmin,nr,val,fr[10*DN];
int ver[2][DN];
pair<int,int>mc[DN*10];
vector<pair<int,int> >v[DN];
queue<int>q;
int vf()
{
for(int i=1;i<=n;i++)
viz[i]=0;
q.push(1);
while(!q.empty())
{
nod=q.front();
q.pop();
viz[nod]=1;
if(nod==n)
continue;
for(auto i:v[nod])
if(!viz[i.x]&&f[nod][i.x]!=cap[nod][i.x])
{
viz[i.x]=1;
pr[i.x]=nod;
pr2[i.x]=i.y;
q.push(i.x);
}
}
return viz[n];
}
void bfs(int type)
{
ver[0][1]=ver[1][n]=1;
if(type==0)
q.push(1);
else
q.push(n);
while(!q.empty())
{
nod=q.front();
q.pop();
for(auto i:v[nod])
if(!ver[type][i.x]&&f[nod][i.x]!=cap[nod][i.x])
{
ver[type][i.x]=1;
q.push(i.x);
}
}
}
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
fin>>a>>b>>c;
mc[i].x=a;
mc[i].y=b;
cap[a][b]=cap[b][a]=c;
v[a].pb({b,i});
v[b].pb({a,i});
}
while(vf())
{
a=0;
for(auto i:v[n])
if(viz[i.x])
{
a++;
pr[n]=i.x;
nod=n;
fmin=1e6;
nr=0;
while(nod!=1)
{
val=cap[pr[nod]][nod]-f[pr[nod]][nod];
if(val<fmin)
{
fmin=val;
nr=1;
}
else
if(val==fmin)
nr++;
nod=pr[nod];
}
nod=n;
while(nod!=1)
{
val=cap[pr[nod]][nod]-f[pr[nod]][nod];
if(val==fmin)
r[pr2[nod]]=1;
f[pr[nod]][nod]+=fmin;
f[nod][pr[nod]]-=fmin;
nod=pr[nod];
}
}
}
bfs(0);
bfs(1);
nr=0;
for(int i=1;i<=m;i++)
if(r[i]&&(ver[0][mc[i].x]&ver[1][mc[i].y]||ver[1][mc[i].x]&ver[0][mc[i].y]))
nr++;
fout<<nr<<'\n';
for(int i=1;i<=m;i++)
if(r[i]&&(ver[0][mc[i].x]&ver[1][mc[i].y]||ver[1][mc[i].x]&ver[0][mc[i].y]))
fout<<i<<'\n';
}