标签:ESS oci 查找 break 并查集 tree intern ring hid
Description
Input
Output
Sample Input
5 8 1 2 3 1 3 7 2 3 10 2 4 4 2 5 8 3 4 6 3 5 2 4 5 17
Sample Output
42
Hint
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,sum;
struct node
{
    int start;///起点
    int end;///终点
    int power;///权值
} edge[20050];
int pre[20050];
int cmp(node a,node b)
{
    return a.power<b.power;///按权值降序排列
    // return a.power<b.power
}
int find(int x)///并查集找祖先
{
    int a;///循环法
    a=x;
    while(pre[a]!=a)
    {
        a=pre[a];
    }
    return a;
}
void merge(int x,int y,int n)
{
    int fx =find(x);
    int fy =find(y);
    if(fx!=fy)
    {
        pre[fx]=fy;
        sum+=edge[n].power;
    }
}
int main()
{
    int i,x,count;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        sum=0;
        count=0;
        for(i=1; i<=m; i++)
        {
            scanf("%d%d%d",&edge[i].start,&edge[i].end,&x);
            edge[i].power=x;
            //edge[i].power=-x;
        }
        for(i=1; i<=m; i++) ///并查集的初始化
        {
            pre[i]=i;
        }
        sort(edge+1,edge+m+1,cmp);
        for(i=1; i<=m; i++)
        {
            merge(edge[i].start,edge[i].end,i);
        }
        for(i=1; i<=n; i++)
        {
            if(pre[i]==i)
            {
                count++;
            }
        }
        if(count==1)
        {
            printf("%d\n",sum);
            // printf("%d\n",-sum);
        }
        else
        {
            printf("-1\n");
        }
    }
    return 0;
}
///普里姆算法
#include<stdio.h>
#include<string.h>
#define MAX 0x3f3f3f3f
using namespace std;
int logo[1010];///用0和1来表示是否被选择过
int map1[1010][1010];
int dis[1010];///记录任意一点到这一点的最近的距离
int n,m;
int prim()
{
    int i,j,now;
    int sum=0;
    for(i=1; i<=n; i++) ///初始化
    {
        dis[i]=MAX;
        logo[i]=0;
    }
    for(i=1; i<=n; i++)
    {
        dis[i]=map1[1][i];
    }
    dis[1]=0;
    logo[1]=1;
    for(i=1; i<n; i++) ///循环查找
    {
        now=-MAX;
        int max1=-MAX;
        for(j=1; j<=n; j++)
        {
            if(logo[j]==0&&dis[j]>max1)
            {
                now=j;
                max1=dis[j];
            }
        }
        if(now==-MAX)///防止不成图
        {
            break;
        }
        logo[now]=1;
        sum=sum+max1;
        for(j=1; j<=n; j++) ///填入新点后更新最小距离,到顶点集的距离
        {
            if(logo[j]==0&&dis[j]<map1[now][j])
            {
                dis[j]=map1[now][j];
            }
        }
    }
    if(i<n)
    {
        printf("-1\n");
    }
    else
    {
        printf("%d\n",sum);
    }
}
int main()
{
    int i,j;
    int a,b,c;
    while(scanf("%d%d",&n,&m)!=EOF)///n是点数
    {
        for(i=1; i<=n; i++)
        {
            for(j=i; j<=n; j++)
            {
                if(i==j)
                {
                    map1[i][j]=map1[j][i]=0;
                }
                else
                {
                    map1[i][j]=map1[j][i]=-MAX;
                }
            }
        }
        for(i=0; i<m; i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            if(map1[a][b]<c)///防止出现重边
            {
                map1[a][b]=map1[b][a]=c;
            }
        }
        prim();
    }
    return 0;
}
标签:ESS oci 查找 break 并查集 tree intern ring hid
原文地址:https://www.cnblogs.com/wkfvawl/p/9246072.html