Pagini recente » Cod sursa (job #78018) | Cod sursa (job #753838) | Cod sursa (job #2448803) | Cod sursa (job #3191160) | Cod sursa (job #2697725)
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
pair<int,int> much[10005];
int cost[1005][1005],floc[1005][1005],tata[1005],n,m;
bool viz[1005],viz2[2][1005];
vector<int> adc[1005];
inline void zero()
{
for(int i=1;i<=1000;++i)
viz[i]=0;
}
bool bfs()
{
zero();
queue<int> q;
viz[1]=1;
q.push(1);
while(!q.empty())
{
int t=q.front();
q.pop();
for(int i=0;i<adc[t].size();++i)
if(cost[t][adc[t][i]]!=floc[t][adc[t][i]] && !viz[adc[t][i]])
{
viz[adc[t][i]]=1;
q.push(adc[t][i]);
tata[adc[t][i]]=t;
if(adc[t][i]==n)
return 1;
}
}
return 0;
}
void altbfs(int st)
{
int sm=1,ok=0;
if(st==n)
ok=1,sm=-1;
queue<int>q;
q.push(st);
zero();
viz2[ok][st]=viz[st]=1;
while(!q.empty())
{
int t=q.front();
q.pop();
for(int i=0;i<adc[t].size();++i)
if(!viz[adc[t][i]] && sm*floc[t][adc[t][i]]>=0 && abs(floc[t][adc[t][i]])<cost[t][adc[t][i]])
{
q.push(adc[t][i]);
viz2[ok][adc[t][i]]=viz[adc[t][i]]=1;
}
}
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
much[i].x=x;
much[i].y=y;
cost[x][y]+=z;
cost[y][x]+=z;
adc[x].push_back(y);
adc[y].push_back(x);
}
while(bfs())
{
int mi=INT_MAX;
for(int i=n;i!=1;i=tata[i])
mi=min(mi,cost[tata[i]][i]-floc[tata[i]][i]);
for(int i=n;i!=1;i=tata[i])
floc[tata[i]][i]+=mi,floc[i][tata[i]]-=mi;
}
vector<int> ans;
altbfs(1);
altbfs(n);
for(int i=1;i<=m;++i)
{
if(floc[much[i].x][much[i].y]<0)
swap(much[i].x,much[i].y);
if(cost[much[i].x][much[i].y]==floc[much[i].x][much[i].y])
if((viz2[0][much[i].x] && viz2[1][much[i].y]))
ans.push_back(i);
}
printf("%lu\n",ans.size());
for(int i=0;i<ans.size();++i)
printf("%d\n",ans[i]);
return 0;
}