Pagini recente » Cod sursa (job #2377005) | Cod sursa (job #2069670) | Cod sursa (job #1206230) | Cod sursa (job #1614137) | Cod sursa (job #2885464)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("critice.in");
ofstream cout("critice.out");
queue<int>qu;
int fre[10005];
int par[10005];
int suma[10005];
int cap[1005][1005];
int flux[1005][1005];
vector<int>adj[1005];
int n;
int bfs()
{
int curr=1,i,k;
qu.push(curr);
fre[1]=1;
while(qu.size())
{
curr=qu.front();
qu.pop();
if(curr!=n)
{
for(i=0; i<adj[curr].size(); i++)
{
k=adj[curr][i];
if(fre[k]==0 && flux[curr][k]!=cap[curr][k])
{
fre[k]=1;
par[k]=curr;
qu.push(k);
}
}
}
}
if(fre[n]==1)
{
return 1;
}
else
{
return 0;
}
}
void bfs (int x)
{
int i,curr,k,val=0;
for(i=1;i<=n;i++)
{
fre[i]=0;
}
if(x==1)
{
val=1;
}
else
{
val=2;
}
fre[x]=1;
suma[x]=val;
qu.push(x);
while(qu.size())
{
curr=qu.front();
qu.pop();
for(i=0;i<adj[curr].size();i++)
{
k=adj[curr][i];
if(fre[k]==0 && flux[curr][k]!=cap[curr][k] && flux[k][curr]!=cap[k][curr])
{
suma[k]+=val;
qu.push(k);
fre[k]=1;
}
}
}
}
int x[100005];
int y[100005];
int main()
{
int i,k,m,a,b,w,flow,pos,curr,fluximus=0;
cin>>n>>m;
for(i=1; i<=m; i++)
{
cin>>a>>b>>w;
cap[a][b]=+w;
cap[b][a]=+w;
adj[a].push_back(b);
adj[b].push_back(a);
x[i]=a;
y[i]=b;
}
pos=bfs();
while(pos==1)
{
for(i=0; i<adj[n].size(); i++)
{
k=adj[n][i];
par[n]=k;
if(flux[k][n]!=cap[k][n] && fre[k]==1)
{
curr=n;
flow=1e7;
while(curr!=1)
{
flow=min(flow,cap[par[curr]][curr]-flux[par[curr]][curr]);
curr=par[curr];
}
curr=n;
if(flow!=0)
{
while(curr!=1)
{
flux[par[curr]][curr]+=flow;
flux[curr][par[curr]]-=flow;
curr=par[curr];
}
fluximus+=flow;
}
}
}
for(i=1; i<=n; i++)
{
fre[i]=0;
}
pos=bfs();
}
bfs(1);
bfs(n);
int cnt=0;
vector<int>vec;
for(i=1; i<=m; i++)
{
a=x[i];
b=y[i];
if(suma[a]==1 && suma[b]==2)
{
cnt++;
vec.push_back(i);
}
else if(suma[b]==1 && suma[a]==2)
{
cnt++;
vec.push_back(i);
}
}
cout<<cnt<<'\n';
for(i=0;i<vec.size();i++)
{
cout<<vec[i]<<'\n';
}
return 0;
}