4901 수감 자 확장 구역 및 조사 집합
2624 단어 데이터 구조
묘사 하 다.
S 타 운 에는 현재 두 개의 교도소 가 있 으 며, 모두 N 명의 범죄자 가 수감 되 어 있 으 며, 번 호 는 각각 1 ~ N 이다.그들 사이 의 관계 도 자연히 극히 조 화 롭 지 못 하 다.많은 범죄자 들 사이 에 원한 이 쌓 여 객관 적 인 조건 이 갖 춰 지면 언제 든 충돌 이 일어 날 수 있다.우 리 는 '원한 치' (하나의 정수 치) 로 어떤 두 범죄자 간 의 원한 정 도 를 나타 내 고 원한 치가 클 수록 이 두 범죄자 간 의 원한 이 많아 진다.만약 에 두 명의 원한 이 c 인 범죄자 가 같은 감옥 에 갇 히 면 그들 둘 사이 에 마찰 이 발생 하고 영향력 이 c 인 충돌 사건 을 초래 할 것 이다. 매년 말 경찰 서 는 이 해 내 교도소 의 모든 충돌 사건 을 영향력 에 따라 큰 것 부터 작은 것 까지 목록 으로 만 든 뒤 S 성 Z 시장 에 게 상신 한다.공무 가 바 쁜 Z 시장 은 리스트 에 있 는 첫 사건 의 영향력 만 보 러 가 고, 영향 이 나 쁘 면 경찰국장 경질 을 검토 할 것 으로 보인다. N 명 범죄자 간 갈등 관 계 를 상세히 살 펴 본 경찰 국장 은 스트레스 를 크게 받 았 다.그 는 충돌 사건 의 영향력 이 작 아 자신의 감 투 를 지 키 기 위해 범죄자 들 을 두 감옥 에서 재분배 할 계획 이다.같은 감옥 에 있 는 두 범죄자 사이 에 원한 이 있다 고 가정 하면 그들 은 매년 어느 순간 마찰 을 일 으 킬 것 이다.그렇다면 어떻게 범죄 자 를 배분 해 야 Z 시장 이 본 그 충돌 사건 의 영향력 을 최소 화 할 수 있 을 까?이 최소 치 는 얼마 입 니까?
입력 형식
첫 번 째 행 위 는 두 개의 정수 N 과 M 으로 각각 범인의 수 와 원한 이 있 는 범인의 대 수 를 나타 낸다.다음 M 행 의 모든 행 위 는 세 개의 정수 aj, bj, cj 로 aj 호 와 bj 호 범죄자 사이 에 원한 이 존재 하고 그 원한 치 는 cj 임 을 나타 낸다.데이터 보증 1 < = aj
출력 형식
Z 시장 이 본 충돌 사건 의 영향력 을 위해 총 1 줄 을 수출 한다.올해 안에 감옥 에서 충돌 사건 이 발생 하지 않 았 다 면 0 을 출력 하 십시오.
샘플 입력
4 6
1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884
샘플 출력
3512
데이터 범위 와 약속
이런 관계 의 문 제 는 확장 영역 과 집합 으로 한다.
두 개의 집합.
적역
먼저 충돌 값 을 큰 것 에서 작은 것 으로 정렬 합 니 다.
합병 집합 은 제목 이 모두 모순 되 기 때문에 x 의 친구 역 과 y 의 적 역 을 합병 하고 x 의 적 역 과 y 의 친구 역 을 합병 하 는 것 이다.
적의 적은 친구 다.감옥 이 두 개 있 으 니까.그래서 만약 에 두 개의 모순 이 발생 한 친구 역 이 한 집합 에 있 거나 적 역 이 한 집합 에 있 으 면 (이 두 사람 이 한 감옥 에 배 치 된 것 과 같다)
현재 충돌 값 만 출력 할 수 있 습 니 다.
#include
using namespace std;
const int M = 100000+100;
int fa[M];
int get(int x)
{
if(x==fa[x])return x;
return fa[x]=get(fa[x]);
}
struct node
{
int a,b,c;
}zf[M];
bool cmp(node a,node b)
{
return a.c>b.c;
}
int main()
{
int n,m;cin>>n>>m;
for(int i=1;i<=n+n;i++)fa[i]=i;
for(int i=1;i<=m;i++)
scanf("%d %d %d",&zf[i].a,&zf[i].b,&zf[i].c);
sort(zf+1,zf+1+m,cmp);
for(int i=1;i<=m;i++)
{
// printf("%d ------ %d ++ %d
",zf[i].a,zf[i].b,zf[i].c);
int gx_friend=get(zf[i].a),gy_friend=get(zf[i].b);
int gx_enemy=get(zf[i].a+n),gy_enemy=get(zf[i].b+n);
if(gx_friend==gy_friend)
{
printf("%d
",zf[i].c);
return 0;
}
fa[gx_friend]=gy_enemy;
fa[gx_enemy]=gy_friend;
if(i==m)
printf("0
");
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.