Mai intai trebuie sa te autentifici.
Cod sursa(job #1091579)
Utilizator | Data | 25 ianuarie 2014 20:37:16 | |
---|---|---|---|
Problema | Critice | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.59 kb |
#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);
}
}
if(viz[n])
return 1;
return 0;
}
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])
{
aux=i;
minim=cap[i][n];
while(prec[aux])
{
minim=min(minim,cap[prec[aux]][aux]);
aux=prec[aux];
}
flux+=minim;
aux=i;
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<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;
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)]);
}
}
}
sort(rasp.begin(),rasp.end());
cout<<rasp.size()<<'\n';
vector<int>::iterator it;
for(it=rasp.begin();it!=rasp.end();it++)
cout<<*it<<'\n';
//cout<<flux<<endl;
cin.close();
cout.close();
return 0;
}