Pagini recente » Cod sursa (job #673072) | Cod sursa (job #962735) | Cod sursa (job #1265948) | Cod sursa (job #1733210) | Cod sursa (job #2502649)
#include<fstream>
#include<vector>
#include<deque>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n,m,x,y,capacitate,cost,start,destinatie,nod,t[610];
int dist[50010],f[50010],c[610][610],z[610][610],flux[610][610],e,minim,sol,muchie[610][610];
vector <int > v[610];
deque <int> coada;
int bellman(){
for(int i=1;i<=destinatie;i++){
dist[i]=1000000000;
f[i]=0;
}
coada.clear();
coada.push_back(start);
f[start]=1;
dist[start]=0;
int checked=0;
while(!coada.empty()){
x=coada.front();
coada.pop_front();
f[x]=0;
for(int i=0;i<v[x].size();i++){
nod=v[x][i];
if(dist[nod]>dist[x]+z[x][nod] &&c[x][nod] >flux[x][nod] ){
dist[nod]=dist[x]+z[x][nod];
t[nod]=x;
if(f[nod]==0){
f[nod]=1;
coada.push_back(nod);
if(nod==destinatie){
checked=1;
}
}
}
}
}
return checked;
}
int main(){
fin>>n>>m>>e;
destinatie=n+m+1;
start=0;
for(int i=1;i<=e;i++){
fin>>x>>y;
cost=0;
y=y+n;
v[x].push_back(y);
v[y].push_back(x);
c[0][x]=1;
c[x][y]=1;
c[y][destinatie]=1;
z[x][y]=cost;
z[y][x]=-cost;
muchie[x][y]=i;
}
for(int i=1;i<=n;i++){
v[i].push_back(start);
v[start].push_back(i);
z[i][start]=0;
z[start][i]=0;
}
for(int i=n+1;i<=n+m;i++){
v[i].push_back(destinatie);
v[destinatie].push_back(i);
z[i][destinatie]=0;
z[destinatie][i]=0;
}
cost=0;
while(bellman()){
minim=100000000000;
nod=destinatie;
while(nod!=0){
minim =min(minim,c[t[nod]][nod]-flux[t[nod]][nod]);
nod=t[nod];
}
nod=destinatie;
while(nod!=0){
cost+=minim*z[t[nod]][nod];
flux[t[nod]][nod]+=minim;
flux[nod][t[nod]]-=minim;
nod=t[nod];
}
sol+=minim;
}
fout<<sol<<"\n";
for(int i=1;i<=n;i++){
for(int j=1;j<=n+m;j++){
if(flux[i][j]==1){
fout<<i<<" "<<j-n<<"\n";
}
}
}
return 0;
}