Pagini recente » Cod sursa (job #303532) | Cod sursa (job #1907438) | Cod sursa (job #2064755) | Cod sursa (job #1951873) | Cod sursa (job #1245756)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
int n,m,c[1005][1005],fol[1005][1005],ant[1005],use[1005],res,inf=2147000000,sol=0,tx[10005],ty[10005];
int crit[10005],meet[1005],k,valsx,valsy,valdx,valdy;
vector <int> v[1005];
queue <int> q;
void BFS2(int x,int val)
{ int i,nod,nod2;
memset(use,0,sizeof(use));
memset(ant,0,sizeof(ant));
q.push(x); meet[x]=val;
while(!q.empty())
{ nod=q.front(); q.pop();
for(i=0;i<v[nod].size();i++)
if (!meet[v[nod][i]] && c[nod][v[nod][i]]>fol[nod][v[nod][i]])
{ nod2=v[nod][i];
q.push(nod2);
meet[nod2]=val;
}
}
}
void BFS(int x)
{ int i,j,nod,nod2;
while(!q.empty()) q.pop();
memset(use,0,sizeof(use));
memset(ant,0,sizeof(ant));
q.push(x); use[x]=1;
while(!q.empty())
{ nod=q.front(); q.pop();
if (nod!=n)
for(i=0;i<v[nod].size();i++)
if (!use[v[nod][i]] && c[nod][v[nod][i]]>fol[nod][v[nod][i]])
{ nod2=v[nod][i];
q.push(nod2);
use[nod2]=1;
ant[nod2]=nod;
}
}
}
int main()
{ int i,j,x,y,cap,n1,n2;
f>>n>>m;
for(i=1;i<=m;i++)
{ f>>x>>y>>cap;
c[x][y]+=cap;
c[y][x]+=cap;
v[x].push_back(y);
v[y].push_back(x);
tx[i]=x; ty[i]=y;
}
for(BFS(1);use[n]>0;BFS(1))
{
for(i=0;i<v[n].size();i++)
if (use[v[n][i]] && c[v[n][i]][n]>fol[v[n][i]][n])
{
x=v[n][i]; res=c[x][n]-fol[x][n];
while(ant[x])
{ n1=ant[x]; n2=x;
res=min(res,c[n1][n2]-fol[n1][n2]);
x=ant[x];
}
x=v[n][i]; fol[x][n]+=res; fol[n][x]+=res;
while(ant[x])
{ n1=ant[x]; n2=x;
fol[n1][n2]+=res;
fol[n2][n1]+=fol[n1][n2];
x=ant[x];
}
sol+=res;
}
} //cout<<sol;
BFS2(1,1); BFS2(n,2);
for(i=1;i<=m;i++)
if (meet[tx[i]]+meet[ty[i]]==3)
{k++; crit[k]=i;}
g<<k<<"\n";
for(i=1;i<=k;i++)
g<<crit[i]<<"\n";
return 0;
}