Pagini recente » Cod sursa (job #95528) | Cod sursa (job #1244991) | Cod sursa (job #635941) | Cod sursa (job #2800719) | Cod sursa (job #2469238)
#include <fstream>
#include <algorithm>
#include <vector>
#include <deque>
using namespace std;
ifstream fin("ghizi.in");
ofstream fout("ghizi.out");
int n, m, nr, minim, sol[5010], Ai[5010], Bi[5010], x, y, k, f[5010], t[5010], capacitate[110][110], flux[110][110];
deque <int> c;
vector <int> a[110];
int bfs(){
int ok=0;
/// initializam vectorul de frecventa
for(int i=0; i<=5000; i++){
f[i]=0;
}
c.push_back(1);
f[1]=1;
/// 1 este sursa, 102 destinatia
while(!c.empty()){
int nod1=c.front();
c.pop_front();
for(int i=0; i<a[nod1].size(); i++){
int nod2=a[nod1][i];
if(f[nod2]==0 && capacitate[nod1][nod2]>flux[nod1][nod2]){
c.push_back(nod2);
t[nod2]=nod1;
f[nod2]=1;
if(nod2==102){
ok=1;
}
}
}
}
return ok;
}
int main(){
fin>>m>>k;
n=102;
for(int i=1; i<=m; i++){
fin>>x>>y;
x++;
y++;
Ai[i]=x;
Bi[i]=y;
a[x].push_back(y);
a[y].push_back(x);
capacitate[x][y]++;
}
a[101].push_back(102);
a[102].push_back(101);
capacitate[101][102]=k;
while(bfs()){
for(int i=0; i<a[n].size(); i++){
int nod=a[n][i];
if(capacitate[nod][n]>flux[nod][n] && f[nod]==1){
minim=capacitate[nod][n]-flux[nod][n];
nr=nod;
while(t[nr]){
minim=min(minim, capacitate[ t[nr] ][nr]-flux[ t[nr] ][nr]);
nr=t[nr];
}
nr=nod;
flux[nod][n]+=minim;
flux[n][nod]-=minim;
while(t[nr]){
flux[ t[nr] ][nr]+=minim;
flux[nr][ t[nr] ]-=minim;
nr=t[nr];
}
}
}
}
int nrr=0;
for(int i=1; i<=m; i++){
if(flux[ Ai[i] ][ Bi[i] ]>0){
nrr++;
sol[nrr]=i;
flux[ Ai[i] ][ Bi[i] ]--;
}
}
fout<<nrr<<"\n";
for(int i=1; i<=nrr; i++){
fout<<sol[i]<<" ";
}
}