Pagini recente » Cod sursa (job #507223) | Cod sursa (job #1032033) | Cod sursa (job #2413462) | Cod sursa (job #2928669) | Cod sursa (job #3032142)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
int n,X,Y,Z,m;
const int N=1e3+5;
int d[N][N],b[N][N],flx[N][N];
vector<int>a[N];
int val,niv[N],p[N];
void bfs()
{
for(int i=1;i<=n;i++)
niv[i]=-1,p[i]=0;
queue<int>q;
q.push(1);
niv[1]=0;
while(!q.empty())
{
int nod=q.front();
q.pop();
for(auto x: a[nod])
if(niv[x]==-1&&d[nod][x]-flx[nod][x]>0)
{
niv[x]=niv[nod]+1;
if(x==n)
return;
q.push(x);
}
}
}
int dfs(int nod,int flux)
{
if(flux==0||nod==n)
return flux;
while(p[nod]<a[nod].size())
{
int x=a[nod][p[nod]];
p[nod]++;
if(niv[x]==niv[nod]+1&&d[nod][x]-flx[nod][x]>0)
{
int y=dfs(x,min(d[nod][x]-flx[nod][x],flux));
if(y)
{
flx[nod][x]+=y;
flx[x][nod]-=y;
return y;
}
}
}
return 0;
}
bool flux_(int &ans)
{
bfs();
if(niv[n]==-1)
return 0;
else
{
int V=0;
while(true)
{
int x=dfs(1,1e9);
if(x==0)
break;
else
V+=x;
}
if(V==0)
return 0;
ans+=V;
return 1;
}
return 0;
}
struct re
{
int x,y,z;
bool orr;
}T[N*10];
vector<int>sol;
int main()
{
f>>n>>m;
for(int i=1;i<=m;i++)
{
f>>X>>Y>>Z;
T[i]={X,Y,Z};
a[X].push_back(Y);
a[Y].push_back(X);
d[X][Y]=Z;
d[Y][X]=Z;
}
while(flux_(val));
for(int i=1;i<=m;i++)
{
int x=T[i].x;
int y=T[i].y;
if(d[x][y]==flx[x][y]||d[x][y]==flx[y][x])
T[i].orr=true;
}
for(int i=1;i<=m;i++)
{
if(T[i].orr==false)
continue;
for(int j=1;j<=m;j++)
{
d[T[j].x][T[j].y]=T[j].z;
d[T[j].y][T[j].x]=T[j].z;
flx[T[j].x][T[j].y]=0;
flx[T[j].y][T[j].x]=0;
}
d[T[i].x][T[i].y]++;
d[T[i].y][T[i].x]++;
int val1=0;
while(flux_(val1));
if(val1>val)
sol.push_back(i);
}
g<<sol.size()<<'\n';
for(auto x : sol)
g<<x<<'\n';
return 0;
}