并查集20pts可过样例求助
  • 板块P1656 炸铁路
  • 楼主_luo_gu
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/18 09:56
  • 上次更新2024/8/18 12:37:18
查看原帖
并查集20pts可过样例求助
950927
_luo_gu楼主2024/8/18 09:56
#include <bits/stdc++.h>
using namespace std ;
int n , m , fa[200] , q[5005][3];
struct jgt{
	int x ; 
	int y ;
}a[5005];
vector <jgt> ans ;
bool cmp ( jgt a , jgt b ){
	if( a.x != b.x ){
		return a.x < b.x ;
	}else{
		return a.y < b.y ; 
	}
}
int find_root( int a ){
	if( fa[a] == a ){
		return a ;
	}
	return fa[a] = find_root(fa[a]) ;
}
void make_together( int a , int b ){
	fa[find_root(a)] = find_root(b) ;
	return ;
}
int main(){
	scanf("%d%d" , &n , &m );
	for( int i = 1 ; i <= m ; i ++){
		int xx , yy ;
		scanf("%d%d" , &xx , &yy );
		a[i].x = min( xx , yy ) ;
		a[i].y = max( xx , yy ) ;
	}
	for( int i = 1 ; i <= m ; i ++ ){
		for( int j = 1 ; j <= n ; j ++ ){
			fa[i] = i ;
		}
		for( int j = 1 ; j <= m ; j ++ ){
			if( i == j ){
				continue ;
			}
			if(find_root(a[j].x) != find_root(a[j].y ) ){
				fa[find_root(a[j].x)] = find_root(a[j].y) ;
			}
		}
		int x = find_root(1);
		for( int j = 2 ; j <= n ; j ++ ){
			if( x != find_root(j)){
				ans.push_back(a[i]) ;
				break ;
			}
		}
	}
	int len = ans.size() ;
	sort( ans.begin() , ans.end() , cmp );
	for( int i = 0 ; i < len ; i ++ ){
		printf("%d %d\n" , ans[i].x , ans[i].y );
	}
	return 0 ;
}
2024/8/18 09:56
加载中...