Pagini recente » Cod sursa (job #2504825) | Cod sursa (job #2291521) | Cod sursa (job #830965) | Cod sursa (job #2466190) | Cod sursa (job #2627460)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("critice.in");
ofstream cout("critice.out");
const int inf=1e9+7;
vector<int> vec[2005];
struct Op
{
int nod;
int edge;
bool cost;
};
vector<Op> norm[1005];
int pred[2005];
int c[2005][2005];
bool viz[2][1005];
bool ok[10005];
queue<int> q;
int main()
{
int n,m,a,b,cst;
cin>>n>>m;
for(int i=1;i<=m;++i)
{
cin>>a>>b>>cst;
norm[a].push_back({b,i,0});
norm[b].push_back({a,i,0});
vec[a].push_back(b+n); vec[b+n].push_back(a);
vec[b].push_back(a+n); vec[a+n].push_back(b);
c[a][b+n]=cst;
c[b][a+n]=cst;
}
for(int i=1;i<=n;++i)
{
vec[i].push_back(i+n); vec[i+n].push_back(i);
c[i+n][i]=inf;
}
int ads;
do
{
for(int i=2;i<=2*n;++i)
pred[i]=0;
pred[1]=-1;
q.push(1);
while(!q.empty())
{
int x=q.front();
q.pop();
for(auto t:vec[x])
if(pred[t]==0 and c[x][t]>0)
{
pred[t]=x;
q.push(t);
}
}
if(pred[2*n])
for(auto t:vec[2*n])
if(pred[t])
{
ads=c[t][2*n];
for(int k=t;pred[k]>0;k=pred[k])
ads=min(ads,c[pred[k]][k]);
if(c[t][2*n]!=inf)
{
c[t][2*n]-=ads;
c[2*n][t]+=ads;
}
for(int k=t;pred[k]>0;k=pred[k])
if(c[pred[k]][k]!=inf)
{
c[pred[k]][k]-=ads;
c[k][pred[k]]+=ads;
}
}
}while(pred[2*n]);
for(int i=1;i<=n;++i)
for(int j=0;j<norm[i].size();++j)
norm[i][j].cost=(min(c[i][norm[i][j].nod+n],c[norm[i][j].nod][i+n])>0);
q.push(1);
viz[0][1]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
for(Op t:norm[x])
if(t.cost==1 and viz[0][t.nod]==0)
{
viz[0][t.nod]=1;
q.push(t.nod);
}
}
q.push(n);
viz[1][n]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
for(Op t:norm[x])
if(t.cost==1 and viz[1][t.nod]==0)
{
viz[1][t.nod]=1;
q.push(t.nod);
}
}
for(int i=1;i<=n;++i)
for(auto t:norm[i])
if(viz[0][i] and viz[1][t.nod])
ok[t.edge]=1;
int tot=0;
for(int i=1;i<=m;++i)
tot+=ok[i];
cout<<tot<<'\n';
for(int i=1;i<=m;++i)
if(ok[i]) cout<<i<<'\n';
return 0;
}