Type: Default 1000ms 256MiB

A City 宗千寻

You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.

BB 国是一个拥有 nn 个城市的国家,nn 个城市依次编号为 1,2,,n1, 2, \dots, nBB 国的首脑计划在国内修建 mm 条城市间的单向道路。

如果从一个城市 xx 出发,经过若干条道路能够到达城市 yy,我们就称 xx 可达 yy。特殊的,我们认为每个城市都可达它本身。注意:xx 可达 yy 并不一定意味着 yy 可达 xx

对于一个城市的集合 SS,如果 SS 中任意两个城市 u,vu, v 都满足 uu 可达 vvvv 可达 uu,那么我们称 SS互通的。特殊的,大小为 11 的集合总是互通的。

如果一个互通的城市集合 AA 满足不存在另一个互通的城市集合 BB 使得 AABB 的真子集,那么我们称 AA 是一个城市群

可以证明,对于任意的修建 mm 条城市间的道路的方案,总能够将 nn 个城市划分为若干个城市群,满足每个城市恰好属于一个城市群且每个城市群包含至少一个城市。

BB 国的首脑要求这 nn 个城市恰好被划分成 XX 个城市群,他还有额外的 qq 个限制 (ai,bi)(a_i, b_i),要求城市 aia_i 与城市 bib_i 属于同一个城市群。

你需要构造一种修建 mm 条道路的方案满足首脑的要求,或者报告满足要求的方案不存在。

如果存在多种可能的方案,你可以输出任意一种。

注意:对于任意的两个城市 u,vu, v,从 uuvv 的道路只能修建至多一条;你不能修建从一个城市到它本身的道路。


输入格式

从标准输入读入数据。

第一行四个整数 n,m,X,qn, m, X, q

接下来 qq 行每行两个正整数,第 i+1i+1 行的两个正整数分别表示 ai,bia_i, b_i


输出格式

如果不存在满足要求的方案,输出一行一个整数 1-1

否则输出 mm 行,每行两个正整数 si,tis_i, t_i,表示你的方案中修建了一条从 sis_itit_i 的单向道路。


样例输入1

5 7 2 1
2 3

样例输出1

2 5
3 2
4 3
5 4
2 3
2 4
3 4

样例输入2

5 2 3 3
1 2
2 3
3 4

样例输出2

-1

数据范围

对于 100%100\% 的数据,保证:

  • 1n,m5×1051 \le n, m \le 5 \times 10^5
  • 0q5×1050 \le q \le 5 \times 10^5
  • 1X,ai,bin1 \le X, a_i, b_i \le n
  • aibia_i \ne b_i

具体数据范围如下表

测试点编号 nn 上限 特殊限制
141 \sim 4 5\le 5 q5q \le 5
575 \sim 7 5×105\le 5 \times 10^5 X=1X = 1
8108 \sim 10 X=nX = n
111411 \sim 14 2×103\le 2 \times 10^3 无特殊限制
152015 \sim 20 5×105\le 5 \times 10^5
#include <bits/stdc++.h>
using namespace std;
template<typename T> inline void rd(T &x){
	x=0;char c=getchar();bool flag=false;
	while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	if(flag)x=-x;
}
template<typename T> inline void wr(T x){
	short st[30],tp=0;
	if(x<0) putchar('-'),x=-x;
	do st[++tp]=x%10,x/=10; while(x);
	while(tp) putchar('0'|st[tp--]);
}
#define kg putchar(' ')
#define dn putchar('\n')
#define R(i,l,r) for(int i=(l);i>=(r);--i)
#define F(i,l,r) for(int i=(l);i<=(r);++i)
//#define int long long
const int N=500005;
int n,m,u,v,x,q,fa[N],sz[N],nxt[N],U[N],V[N],tot;
vector<int>root;
vector<int>g[N];
int find(int i){return i==fa[i]?i:fa[i]=find(fa[i]);}
void merge(int i,int j){
	int fi=find(i),fj=find(j);
	if(fi!=fj)fa[fi]=fj,sz[fj]+=sz[fi];
}
void add(int i,int j){
	if(nxt[i]==j||i==j)return ;
	++tot,U[tot]=i,V[tot]=j;
}
bool cmp(int i,int j){return sz[i]<sz[j];}
void GG(){wr(-1),dn;exit(0);}
signed main(){
	rd(n),rd(m),rd(x),rd(q);
	F(i,1,n)fa[i]=i,sz[i]=1;
	F(i,1,q){rd(u),rd(v);merge(u,v);}
	F(i,1,n)if(fa[i]==i)root.push_back(i); 
	if(root.size()<x)GG();
	sort(root.begin(),root.end(),cmp);
	F(i,x,root.size()-1)fa[root[i]]=root[x-1];
	F(i,1,n)g[find(i)].push_back(i);
	F(i,1,n){
		int siz=g[i].size();
		if(siz<=1)continue;
		F(j,0,siz-1){
			add(g[i][j],g[i][(j+1)%siz]);
			nxt[g[i][j]]=g[i][(j+1)%siz];
		}
	}
	if(tot>m)GG();
	F(i,1,n){
		if(tot>=m)break;
		F(j,i+1,n){
			if(tot>=m)break;
			int fi=find(i),fj=find(j);
			if(fi<fj)add(i,j);
			else if(fi>fj)add(j,i);
			else add(i,j),add(j,i);
		}
	}
	if(tot<m)GG();
	F(i,1,m)wr(U[i]),kg,wr(V[i]),dn;
    return 0;
}

7.31日竞赛3班造数据

Not Attended
Status
Done
Rule
IOI
Problem
8
Start at
2025-7-31 18:00
End at
2025-7-31 21:00
Duration
3 hour(s)
Host
Partic.
8