Pagini recente » Cod sursa (job #1565548) | Cod sursa (job #1426775) | Cod sursa (job #1091953)
#include <fstream>
#include <algorithm>
#include <queue>
#include <bitset>
#include <utility>
#include <vector>
using namespace std;
vector<int> graf[1005];
int n,cap[1005][1005],prec[1005];
bitset<1005> viz;
queue<int> coada;
int cul[1005];
inline bool bfs()
{
int i,y;
for(i=2;i<=n;i++)
viz[i]=0;
while(!coada.empty())
coada.pop();
coada.push(1);
viz[1]=1;
prec[1]=0;
vector<int>::iterator it;
while(!coada.empty())
{
y=coada.front();
coada.pop();
for(it=graf[y].begin();it!=graf[y].end();it++)
if(cap[y][*it])
if(!viz[*it])
{
viz[*it]=1;
prec[*it]=y;
if(*it==n)
break;
coada.push(*it);
}
}
return viz[n];
}
inline void dinic()
{
int i;
int minim;
int aux;
while(bfs())
for(i=n-1;i>0;i--)
if(cap[i][n])
if(viz[i])
{
prec[n]=i;
aux=n;
minim=cap[i][n];
while(prec[aux])
{
minim=min(minim,cap[prec[aux]][aux]);
aux=prec[aux];
}
aux=n;
while(prec[aux])
{
cap[prec[aux]][aux]-=minim;
cap[aux][prec[aux]]+=minim;
aux=prec[aux];
}
}
}
inline void bfs2()
{
int y;
while(!coada.empty())
coada.pop();
coada.push(1);
cul[1]=1;
vector<int>::iterator it;
while(!coada.empty())
{
y=coada.front();
coada.pop();
for(it=graf[y].begin();it!=graf[y].end();it++)
if(cap[y][*it])
if(!cul[*it])
{
cul[*it]=1;
coada.push(*it);
}
}
coada.push(n);
cul[n]=2;
while(!coada.empty())
{
y=coada.front();
coada.pop();
for(it=graf[y].begin();it!=graf[y].end();it++)
if(cap[*it][y])
if(!cul[*it])
{
cul[*it]=2;
coada.push(*it);
}
}
}
int main()
{
ifstream cin("critice.in");
ofstream cout("critice.out");
vector<pair<int,int> > muchii;
int m=0,i,a,b,c;
cin>>n>>m;
for(i=1;i<=m;i++)
{
cin>>a>>b>>c;
muchii.push_back(make_pair(a,b));
graf[a].push_back(b);
graf[b].push_back(a);
cap[a][b]=c;
cap[b][a]=c;
}
if(n==1)
{
cout<<"0\n";
cin.close();
cout.close();
return 0;
}
dinic();
bfs2();
vector<int> rasp;
for(i=0;i<m;i++)
{
if(cul[muchii[i].first]==1 && cul[muchii[i].second]==2)
rasp.push_back(i+1);
if(cul[muchii[i].first]==2 && cul[muchii[i].second]==1)
rasp.push_back(i+1);
}
cout<<rasp.size()<<'\n';
vector<int>::iterator it;
for(it=rasp.begin();it!=rasp.end();it++)
cout<<*it<<'\n';
cin.close();
cout.close();
return 0;
}