QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#491475#8757. 图FffooooTL 0ms0kbC++142.4kb2024-07-25 19:47:112024-07-25 19:47:11

Judging History

你现在查看的是最新测评结果

  • [2024-07-25 19:47:11]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2024-07-25 19:47:11]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
int mian(); int main() { return mian(); }

const int N = 1e5 + 15, M = 2e5 + 25;
int n, m, k;

int id(const int i, const int j) { return i + (j - 1) * n; }
struct UF {
	int fa[M], siz[M];
	void init_fa() { for(int i = 1; i < M; ++i) fa[i] = i, siz[i] = 1; }
	int get(const int x) { if( x == fa[x] ) return x; return fa[x] = get(fa[x]); }
	void us(int u, int v) {
		u = get(u); v = get(v);
		if( siz[u] < siz[v] ) swap(u, v);
		siz[u] += siz[v]; fa[v] = u;
	}
}uf;

vector<int> eg[M];
void add(const int u, const int v) { eg[u].push_back(v); eg[v].push_back(u); }

int fa[N], dep[N];
void dfs_tree(const int u, const int dad) {
	fa[u] = dad; dep[u] = dep[dad] + 1;
	for(auto v : eg[u]) if( v != dad ) dfs_tree(v, u);
}

void solvp(const int u, const int v) {
	printf("%d %d\n", u, v);
	for(int now = 1; now <= k; ++now) {
		dfs_tree( id(v, now), 0 );
		printf("%d ", dep[ id(u, now) ]);
		int x = id(u, now);
		while( x != 0 ) printf("%d ", x), x = fa[x];
		puts("");
	}
}
void solve() {
	scanf("%d%d", &n, &m);
	k = ceil( (double)m / (double)(n - 1) );
	uf.init_fa();
	for(int i = 1; i <= id(n, k); ++i) eg[i].clear();
	for(int i = 1, u, v; i <= m; ++i) {
		scanf("%d%d", &u, &v);
		for(int now = 1; now <= k; ++now) 
			if( uf.get( id(u, now) ) != uf.get( id(v, now) ) ) { add( id(u, now), id(v, now) ); uf.us( id(u, now), id(v, now) ); break; }
	}
	for(int u = 1; u <= n; ++u) if( uf.get( id(u, k) ) != id(u, k) ) return (void) solvp( u, uf.get( id(u, k) ) % n );
	puts("-1");
}
int mian() {
	int T; scanf("%d", &T);
	while( T-- ) solve();
	return 0;
} /*
给定一张 $n$ 点 $m$ 条边的图,求一个点对 $(u,v)$ 满足他们之间有 $k=\lceil \dfrac{m}{n-1} \rceil$ 条边不相交的路径 
$n\le 10^5, m\le 2\times 10^5$ 
$1s, 512MB$

考虑直接构造出 $k$ 条路经 
那么不妨直接构造出来 $k$ 层图,使得这 $k$ 层图中,任意两个点的路径在 $k$ 张图上互不相交 
也就是每一条边只属于一张图。 
那么对于每一层图,如果要加入的边 $(u,v)$ 已经联通,那么就加入到下一层图中,一直知道第一个不连通的图中 
那么,一层至多有 $n-1$ 条边(一棵树,全联通),于是至少有 $\lceil \dfrac{m}{n-1} \rceil=k$ 层图 
找到第 $k$ 层的任意一队点并在下面的层中找到对应的路径即可 
*/

详细

Test #1:

score: 0
Time Limit Exceeded

input:

10000
2 20
1 2
1 2
2 1
1 2
1 2
2 1
1 2
2 1
1 2
1 2
1 2
1 2
2 1
1 2
1 2
2 1
1 2
1 2
1 2
2 1
2 20
2 1
2 1
2 1
2 1
2 1
1 2
1 2
1 2
1 2
2 1
1 2
1 2
2 1
1 2
1 2
2 1
1 2
1 2
2 1
1 2
2 20
1 2
2 1
1 2
1 2
2 1
2 1
1 2
1 2
2 1
2 1
1 2
1 2
1 2
1 2
2 1
1 2
1 2
1 2
2 1
2 1
2 20
1 2
2 1
2 1
1 2
1 2
1 2
2 1
1 2
2 ...

output:

1 0
0 1 
0 3 
0 5 
0 7 
0 9 
0 11 
0 13 
0 15 
0 17 
0 19 
0 21 
0 23 
0 25 
0 27 
0 29 
0 31 
0 33 
0 35 
0 37 
0 39 
2 1
3 2 1 
3 4 3 
3 6 5 
3 8 7 
3 10 9 
3 12 11 
3 14 13 
3 16 15 
3 18 17 
3 20 19 
3 22 21 
3 24 23 
3 26 25 
3 28 27 
3 30 29 
3 32 31 
3 34 33 
3 36 35 
3 38 37 
3 40 39 
1 0
2 ...

result: