列表

详情


NC212821. 小y的旅行

描述

夏天的旅行是无限快乐,Alan想和自己最喜欢的小y开启旅程,可是小y却有着一些独自的看法!
Alan最近得到了一张London的地图,准备带着小y去旅行,其中详细标明了London内的n个景点,
其中共有m条双向道路连接着这n个景点。但是由于小y的精力有限,她实在没有办法将n个景点全部都游览一
遍,于是只好算了一个她喜欢的数字k,她只想详细游览前k个景点,其他的等以后有机会再来。
受到了小y自己的困扰,小y特别害怕自己会在某个环上走来走去,她觉得这样的重复旅游去而导致可怕的事情发生,所以她希望
Alan能帮在地图上删去一些边,使得所有编号不大于k的所有景点都不在环上。

输入描述

第一行三个正整数n,m,k
接下来m行,每行有两个正整数u,v代表一条无向边

输出描述

一行一个整数代表最少删去的边数

示例1

输入:

11 13 5
1 2
1 3
1 5
3 5
2 8
4 11
7 11
6 10
6 9
2 3
8 9
5 9
9 10

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 1387ms, 内存消耗: 31224K, 提交时间: 2020-11-20 00:46:58

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int pre[maxn],u[2*maxn],v[2*maxn],n,m,k,ans;
int xfind(int x){
	return pre[x]==x ? x : pre[x]=xfind(pre[x]);
}
int main() {
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++) pre[i]=i;
	for(int i=1;i<=m;i++){
		cin>>u[i]>>v[i];
		if(u[i]>k&&v[i]>k) pre[xfind(u[i])]=xfind(v[i]);
	}
	for(int i=1;i<=m;i++){
		if(u[i]<=k || v[i]<=k){
			int a=xfind(u[i]),b=xfind(v[i]);
			if(a==b) ans++; 
			else pre[a]=b;
		}
	}
	cout<<ans<<endl;
}

上一题