Pagini recente » Cod sursa (job #891109) | Cod sursa (job #2352776) | Cod sursa (job #2821197) | Cod sursa (job #1859541) | Cod sursa (job #873685)
Cod sursa(job #873685)
#include<queue>
#include<string.h>
#include<stdio.h> // mesaj pentru visan:
#include<vector> // Teo te idolatrizeaza ! a facut un vector cu numele
using namespace std; // visite = Vi(san)Site ; Congrats !
FILE*in=fopen("cuplaj.in","r"); // si ,daca nu stiai, greedy=izuri ;
FILE*out=fopen("cuplaj.out","w");
const int MAXSIZE=20003;
int flux[MAXSIZE][MAXSIZE];
bool cap[MAXSIZE][MAXSIZE];
int tata[MAXSIZE],maxflow;
vector < pair<int,int> > answer;
bool bfs();
int noduriS,noduriD,muchii,solutie;
vector <int> a[MAXSIZE];
int main()
{
fscanf(in,"%d%d%d",&noduriS,&noduriD,&muchii);
for(int i=1;i<=muchii;++i)
{
int data1,data2;
fscanf(in,"%d%d",&data1,&data2);
data2+=noduriS;
a[data1].push_back(data2);
a[data2].push_back(data1);
cap[data1][data2]=1;
}
for(int i=1;i<=noduriS;++i)
{
cap[0][i]=true;
a[0].push_back(i);
}
noduriD+=(noduriS+1);
for(int i=noduriS+1;i<noduriD;++i)
{
a[i].push_back(noduriD);
a[noduriD].push_back(i);
cap[i][noduriD]=true;
}
while(bfs())
{
for(int j=0;j<(int)a[noduriD].size();++j)
{
if(tata[a[noduriD][j]]==-1 || cap[a[noduriD][j]][noduriD]==flux[a[noduriD][j]][noduriD])
continue;
tata[noduriD] = a[noduriD][j];
int minim=100001;
for(int i=noduriD;i;i=tata[i])
minim=min(minim,(int)cap[tata[i]][i]-flux[tata[i]][i]);
if(!minim)
continue;
for(int i=noduriD;i;i=tata[i])
{
solutie = i;
++flux[tata[i]][i];
--flux[i][tata[i]];
}
answer.push_back(make_pair(solutie,(int)a[noduriD][j]-noduriS));
maxflow++;
}
}
fprintf(out,"%d\n",maxflow);
for(int i=0;i<(int)answer.size();++i)
fprintf(out,"%d %d\n",answer[i].first,answer[i].second);
fclose(in);
fclose(out);
}
bool bfs()
{
memset(tata,-1,sizeof(tata));
queue <int> q;
q.push(0);
while(!q.empty())
{
int nod=q.front();
q.pop();
if(nod==noduriD)
break;
for(int i=0;i<(int)a[nod].size();++i)
{
if(tata[a[nod][i]]==-1 && flux[nod][a[nod][i]]!=cap[nod][a[nod][i]])
{
tata[a[nod][i]]=nod;
q.push(a[nod][i]);
}
}
}
if(tata[noduriD]==-1)
return false;
else
return true;
}