zoukankan      html  css  js  c++  java
  • 畅通工程

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    const int MaxSize=105;
    const int INF=0x3f3f3f3;
    using namespace std;
    int Graph[MaxSize][MaxSize];
    int dis[MaxSize];
    int op[MaxSize];
    int vest[MaxSize];
    int N,M;
    void prime()
    {
    for(int i=1;i<=M;i++)
    {
    dis[i]=Graph[1][i];
    op[i]=0;
    }
    int flag=0;
    op[1]=1;
    int sum=0;
    for(int k=1;k<M;k++)
    {
    int Min=INF;
    flag=0;
    for(int i=1;i<=M;i++)
    if(op[i]==0&&dis[i]<Min)
    {
    flag=i;
    Min=dis[i];
    }
    op[flag]=1;
    sum+=Min;
    for(int i=1;i<=M;i++)
    if(op[i]==0&&Graph[flag][i]<dis[i])
    dis[i]=Graph[flag][i];
    }

    printf("%d ",sum);

    }
    int Find (int t)
    {
    if(vest[t]==0)return t;
    return Find(vest[t]);
    }
    void HeBing(int a,int b)
    {
    int x=Find(a);
    int y=Find(b);
    if(x!=y)vest[x]=y;
    }
    int main()
    {
    while(scanf("%d",&N),N)
    {

    scanf("%d",&M);
    for(int i=0;i<=M;i++)
    for(int j=0;j<=M;j++)
    Graph[i][j]=0x3f3f3f3f;
    int a,c,b,count=0;
    for(int i=1;i<=M;i++)
    vest[i]=0;
    for(int i=1;i<=N;i++)
    {
    scanf("%d%d%d",&a,&b,&c);
    HeBing(a,b);//将两条联通的道路合并在一个集合
    Graph[a][b]=Graph[b][a]=c;
    }
    for(int i=1;i<=M;i++)
    if(vest[i]==0)++count;
    if(count-1!=0)printf("? ");//判断是否全部在一个 集合内,即是否连通
    else
    prime();
    }
    return 0;
    }

    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    012 字典
    011 递归
    010 函数与闭包
    009 格式化
    000 机器学习的概念原理
    008 元组
    007 列表
    005 Numpy的基本操作
    071 SparkStreaming与SparkSQL集成
    070 DStream中的transform和foreachRDD函数
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/5041372.html
Copyright © 2011-2022 走看看