Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import core.bitop;
- import std.algorithm;
- import std.array;
- import std.container;
- import std.conv;
- import std.exception;
- import std.functional;
- import std.math;
- import std.numeric;
- import std.range;
- import std.stdio;
- import std.string;
- import std.typecons;
- import std.file;
- import std.bigint;
- string TASK = "pairs";
- alias pair = Tuple !(int, "l", int, "r");
- int[][] e;
- int[] pr, used;
- pair[] ans;
- int timer = 1;
- bool dfs(int st){
- used[st] = timer;
- foreach (to; e[st]){
- if (pr[to] == -1 || (used[pr[to]] < timer && dfs(pr[to]))){
- pr[to] = st;
- return true;
- }
- }
- return false;
- }
- void main(){
- File fin = File(TASK ~ ".in", "r");
- File fout = File(TASK ~ ".out", "w");
- int n, m;
- fin.readf("%s %s", &n, &m);
- fin.readln;
- e = new int[][](n, 0);
- foreach (i; 0..n){
- e[i] = fin.readln.split.map !(to !(int)).array;
- e[i] = e[i][0..e[i].length - 1];
- e[i][] -= 1;
- }
- pr = new int[m];
- used = new int[n];
- pr[] -= 1;
- foreach (v; 0..n){
- if (dfs(v))
- ++timer;
- }
- ans = new pair[0];
- foreach (i; 0..m){
- if (pr[i] != -1){
- ans ~= pair(pr[i] + 1, i + 1);
- }
- }
- fout.writeln(ans.length);
- foreach (a; ans){
- fout.writeln(a.l, " ", a.r);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement