Pagini recente » Istoria paginii runda/ms98 | Cod sursa (job #1532052) | Cod sursa (job #468766) | Istoria paginii runda/baraj2017 | Cod sursa (job #962675)
Cod sursa(job #962675)
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
int n,m,i,x,y,flux,mini,c[1010][1010],fl[1010][1010],t[1010];
queue<int>q;
vector<int>sol,l[1010];
bool viz[1010],a[1010],b[1010];
struct ooo{int x,y,c;};
ooo v[10100];
inline int abs(int x)
{
if(x<0)
return -x;
return x;
}
void bfs1(int x,bool a[])
{
int i,y;
q.push(x);
while(!q.empty())
{
x=q.front();
q.pop();
for(i=0;i<l[x].size();++i)
{
y=l[x][i];
if(abs(fl[x][y])<c[x][y]&&!a[y]&&y!=n&&y!=1)
{
a[y]=1;
q.push(y);
}
}
}
}
int bfs()
{
int i,x,y;
memset(viz,0,sizeof(viz));
q.push(1);
while(!q.empty())
{
x=q.front();
q.pop();
for(i=0;i<l[x].size();++i)
{
y=l[x][i];
if(fl[x][y]<c[x][y]&&!viz[y])
{
viz[y]=1;
q.push(y);
t[y]=x;
}
}
}
return viz[n];
}
int main()
{
f>>n>>m;
for(i=1;i<=m;++i)
{
f>>v[i].x>>v[i].y>>v[i].c;
l[v[i].x].push_back(v[i].y);
l[v[i].y].push_back(v[i].x);
c[v[i].x][v[i].y]=c[v[i].y][v[i].x]=v[i].c;
}
while(bfs())
{
for(i=1;i<=n;++i)
{
if(c[i][n]>fl[i][n])
{
mini=c[i][n]-fl[i][n];
x=i;
while(x!=1)
{
mini=min(mini,c[t[x]][x]-fl[t[x]][x]);
x=t[x];
}
x=i;
while(x!=1)
{
fl[t[x]][x]+=mini;
fl[x][t[x]]-=mini;
x=t[x];
}
fl[i][n]+=mini;
fl[n][i]-=mini;
flux+=mini;
}
}
}
bfs1(1,a);
bfs1(n,b);
a[1]=b[n]=1;
for(i=1;i<=m;++i)
{
x=v[i].x;
y=v[i].y;
if(((a[x]&&b[y])||(a[y]&&b[x]))&&(c[x][y]==fl[x][y]||c[y][x]==fl[y][x]))
sol.push_back(i);
}
g<<sol.size()<<'\n';
for(i=0;i<sol.size();++i)
g<<sol[i]<<'\n';
return 0;
}