HDU1233 또는 만약 expedite 프로젝트 (최소 모든 정점 크루스 칼과 분리 된-세트를 포함 스패닝 트리)

문제 설명
지방 농촌 교통 상황 조사, 통계를 나열 두 마을 사이의 거리를 얻을. 대상 지방 정부 "교통 프로젝트를 부드럽게는"두 마을 사이의 지방 도로 포장 요구 사항의 전체 길이 (간접적 도로에 도달 할 수있는 한,하지만 반드시 직접 도로에 연결되지 않음) 도로 교통을 달성 할 수 있도록하는 것입니다 최소. 도로의 최소 전체 길이를 계산합니다.

입력
테스트 입력은 여러 테스트 케이스가 포함되어 있습니다. N (N-1) 마을 사이의 거리에 대응 / 2 행 다음, 각 행은 양의 정수의 쌍을 주어 각각 두 마을 각 테스트 케이스 마을 N (<100)의 첫 번째 숫자 열을 주어 번호, 두 마을 사이의 거리. 편의상 마는 1로 넘버링 N.
N이 0의 경우 처리되지 입력단 인 경우.

출력
각 테스트 케이스에 대한 선, 도로의 최소의 총 길이의 출력.

입력 샘플
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0

샘플 출력
3
(5)

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
//这道题就是并查集和K的用法还有就是结构体数组
struct S{
    int s,e,dis;//分别代表起点,终点,和距离
}way[100];
int a[100];
int zuzong(int x){
    if(x==a[x])
        return x;
    else
        return zuzong(a[x]);
}
bool check(int x,int y){
    return zuzong(x)==zuzong(y);
}
void  merge1(int x,int y){
    a[zuzong(x)]=zuzong(y);
}

int main(){
    int n,i,sum=0;
    while(scanf("%d",&n)!=EOF&&n!=0){
       //先是对这些点进行初始化
       for(i=1;i<=n;i++)
            a[i]=i;
        int m=n*(n-1)/2;//这是路的数目
       //再开始输入
       for(i=0;i<m;i++)
        scanf("%d%d%d",&way[i].s,&way[i].e,&way[i].dis);
       //然后就开始计算距离吧
       for(i=0;i<m;i++){
        if(!check(way[i].s,way[i].e)){
            sum+=way[i].dis;
            merge1(way[i].s,way[i].e);
        }

       }
       printf("%d\n",sum);
    }
}
게시 72 개 원래 기사 · 원 찬양 5 · 조회수 2797

추천

출처blog.csdn.net/qq_41115379/article/details/105004543