Pagini recente » Cod sursa (job #1281627) | Cod sursa (job #463265) | Cod sursa (job #976828) | Cod sursa (job #735497) | Cod sursa (job #1091636)
#include <fstream>
#include <queue>
#include <list>
#include <bitset>
#include <algorithm>
#include <utility>
//#include <map>
#include <vector>
using namespace std;
list<int> graf[1005];
int n,cap[1005][1005],prec[1005];
bitset<1005> viz;
queue<int> coada;
//map<pair<int,int>,int > harta;
int cul[1005];
//De pus caz particular cu n=1
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;
list<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;
coada.push(*it);
}
}
return viz[n];
}
int flux;
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];
}
flux+=minim;
aux=n;
while(prec[aux])
{
cap[prec[aux]][aux]-=minim;
cap[aux][prec[aux]]+=minim;
aux=prec[aux];
}
}
}
}
void bfs2()
{
int y;
coada.push(1);
cul[1]=1;
list<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);
}
}
}
vector<pair<int,int> > muchii;
vector<int> rasp;
int main()
{
ifstream cin("critice.in");
ofstream cout("critice.out");
int m=0,i,a,b,c;
cin>>n>>m;
for(i=1;i<=m;i++)
{
cin>>a>>b>>c;
//harta[make_pair(a,b)]=i;
//harta[make_pair(b,a)]=i;
muchii.push_back(make_pair(a,b));
graf[a].push_back(b);
graf[b].push_back(a);
cap[a][b]+=c; //Punem apoi si =
cap[b][a]+=c; //-=-
}
if(n==1)
{
cout<<"0\n";
cin.close();
cout.close();
return 0;
}
dinic();
bfs2();
list<int>::iterator it2;
/*
for(i=1;i<n;i++)
if(cul[i]==1)
{
for(it2=graf[i].begin();it2!=graf[i].end();it2++)
{
if(cul[*it2]==2 && (cap[i][*it2]==0))
{
rasp.push_back(harta[make_pair(i,*it2)]);
}
}
}
*/
vector<pair<int,int> >::iterator it3;
vector<int>::iterator it;
for(i=1,it3=muchii.begin();i<=m && it3!=muchii.end();it3++,i++)
{
if(cul[it3->first]==1 && cul[it3->second]==2 && (cap[it3->first][it3->second]==0 || cap[it3->second][it3->first]==0))
rasp.push_back(i);
if(cul[it3->first]==2 && cul[it3->second]==1 && (cap[it3->second][it3->first]==0 || cap[it3->first][it3->second]==0))
rasp.push_back(i);
}
//sort(rasp.begin(),rasp.end());
cout<<rasp.size()<<'\n';
for(it=rasp.begin();it!=rasp.end();it++)
cout<<*it<<'\n';
//cout<<flux<<endl;
cin.close();
cout.close();
return 0;
}