Pagini recente » Cod sursa (job #519078) | Cod sursa (job #1642224) | Cod sursa (job #1742976) | Cod sursa (job #1636303) | Cod sursa (job #1942775)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
#define MAXN 20005
#define FOR(i, a, b) for (int i = (int)(a); i <= (int)(b); ++ i)
struct Edge {
int nod,cap,flow;
Edge(int nod,int cap,int flow) {
this->nod=nod;
this->cap=cap;
this->flow=flow;
}
};
vector<Edge> adj[MAXN];
bitset<MAXN> vis;
int parent[MAXN];
int n, m, src, sink;
void read_in(void) {
int cnt_edges, x, y;
fin>>n>>m>>cnt_edges;
for (; cnt_edges --; )
{
fin>>x>>y;
adj[x].push_back(Edge(y+n,1,0));
adj[y+n].push_back(Edge(x,0,0));
}
src = 0;
FOR (i, 1, n) {
adj[src].push_back(Edge(i,1,0));
adj[i].push_back(Edge(src,0,0));
}
sink = n+m+1;
FOR (i, n + 1, n + m) {
adj[i].push_back(Edge(sink,1,0));
adj[sink].push_back(Edge(i,0,0));
}
}
bool BFS(int src,int sink) {
queue<int> q;
vis.reset();
q.push(src);
vis[src]=1;
for(;q.size();q.pop()) {
int cNode=q.front();
for(auto& w:adj[cNode]) {
int nextN=w.nod;
if(vis[nextN]||w.cap==w.flow) continue;
vis[nextN]=1;
q.push(nextN);
parent[nextN]=cNode;
if(nextN==sink) return 1;
}
}
return 0;
}
int main(void)
{
read_in();
int cuplaj=0;
for(;BFS(src,sink);) {
for(int t=sink;t!=src;t=parent[t]) {
for(auto& q:adj[t]) {
if(q.nod!=parent[t]) continue;
q.flow--;
break;
}
for(auto& q:adj[parent[t]]) {
if(q.nod!=t) continue;
q.flow++;
break;
}
}
}
FOR(i,1,n) for(auto q:adj[i]){
if(q.nod==src) continue;
if(q.flow==1) cuplaj++;
}
fout<<cuplaj<<'\n';
FOR(i,1,n) for(auto q:adj[i]) {
if(q.nod==src) continue;
if(q.flow==1) fout<<i<<' '<<q.nod-n<<'\n';
}
return 0;
}