`
暴风雪
  • 浏览: 387944 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[prim]aizuoj:There is No Alternative

 
阅读更多

题目地址:http://judge.u-aizu.ac.jp/onlinejudge/contest/ICPCOOC2014/F.pdf

大致题意:

       求出一个带权无向图中哪些边一定是最小生成树的一部分,输出这边的数量和他们权值的和。

 

大致思路:

      先求一遍prim,记录哪些边在这个最小生成树上。然后依次枚举删去这些边,如果删掉第i条边之后最小生成树长度增加,则第i条边一定在最小生成树上。

 

附上这辈子写过的最丑的代码

 

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int nMax=1000;
const int mMax=100010;
const int inf=1000010;

int n,m,map[nMax][nMax],mark[mMax],mpp[nMax][nMax];

int dis[nMax],fff[nMax],ans,mintree[nMax][2],nk;
int prim(bool isis){   //  自己的prim模板。
    int i, j, now,aaa,bbb;
    int  min_node, min_edge;
    for(i = 1; i <=n; i ++)
        dis[i] = inf-10;
    now = 1;
    ans = 0;
    nk=1;
    for(i = 0; i < n-1; i ++){
        dis[now] = -1;    //   将dis[]的值赋-1,表示已经加入生成树中。
        min_edge = inf;
        for(j = 1; j <= n; j ++)    //   更新每个顶点所对应的dis[]值。
            if(now != j && dis[j] >= 0 ){
                if(map[now][j]<dis[j]){
                    dis[j]=map[now][j];
                    fff[j]=now;
                }
                if(dis[j] < min_edge){
                    min_edge = dis[j];
                    min_node = j;
                }
            }
        now = min_node;
       if(isis==1){
            aaa=now;
            bbb=fff[now];
            mintree[nk][0]=aaa;
            mintree[nk++][1]=bbb;
       }
        ans += min_edge;
    }
    return ans;
}

int val[mMax];
int main(){
    int i,j,a,b,c;
    while(scanf("%d%d",&n,&m)!=EOF){
        for(i=1;i<=n;i++)for(j=1;j<=n;j++)map[i][j]=inf;
        memset(mark,0,sizeof(mark));
        for(i=1;i<=m;i++){
            scanf("%d%d%d",&a,&b,&c);
            map[a][b]=map[b][a]=c;
            mpp[a][b]=mpp[b][a]=i;
            val[i]=c;
        }

        int sum = prim(1);
        a=map[mintree[1][0]][mintree[1][1]];
        map[mintree[1][0]][mintree[1][1]]=map[mintree[1][1]][mintree[1][0]]=inf;
        if(sum!=prim(0)){
            mark[mpp[mintree[1][0]][mintree[1][1]]]=1;
        }
        for(i=2;i<=n-1;i++){
            map[mintree[i-1][0]][mintree[i-1][1]]=map[mintree[i-1][1]][mintree[i-1][0]]=a;
            if(mark[mpp[mintree[i][0]][mintree[i][1]]])continue;
            a=map[mintree[i][0]][mintree[i][1]];
            map[mintree[i][0]][mintree[i][1]]=map[mintree[i][1]][mintree[i][0]]=inf;
            b=prim(0);
//            cout<<b<<endl;
            if(sum!=b){
                mark[mpp[mintree[i][0]][mintree[i][1]]]=1;
            }
        }
        ans=0,sum=0;
        for(i=1;i<=m;i++){
            if(mark[i]){
                ans++;
                sum+=val[i];
            }
        }
        printf("%d %d\n",ans,sum);
    }
    return 0;
}

 

 

0
0
分享到:
评论

相关推荐

    Prim算法最小生成树

    Prim 算法求最小生成树 语法:prim(Graph G,int vcount,int father[]); 参数: G:图,用邻接矩阵表示 vcount:表示图的顶点个数 father[]:用来记录每个节点的父节点 返回值:null 注意: 常数max_vertexes 为图...

    数据结构实验报告9-图-Prim算法求最小生成树-实验内容与要求.docx

    根据给定的文件信息,本篇内容将围绕“数据结构实验报告9-图-Prim算法求最小生成树”展开,具体涉及的知识点包括Prim算法的基本原理及其应用、图的邻接矩阵存储结构的设计与实现、最小生成树的概念及求解过程、以及...

    实现的prim算法的C++源代码

    ### 实现Prim算法的C++源代码解析与知识点详解 #### Prim算法简介 Prim算法是一种用于寻找图中最小生成树(Minimum Spanning Tree, MST)的贪心算法。最小生成树是指在一个连通、无向的加权图中,通过选择部分边...

    Prim算法与Kruskal算法求最小生成树

    在这个问题中,Prim算法和Kruskal算法是两种常用的方法。 1. Prim算法: Prim算法是一种贪心策略,它从一个起始顶点开始,逐步添加边,每次添加一条与已选择顶点集形成最小权重边的新边。这个过程不断进行,直到...

    prim算法生成最小生成树(c++).

    Prim算法是一种有效的解决最小生成树问题的方法,它由Robert C. Prim在1930年代提出,主要用于寻找加权无向图中的最小生成树。在这个程序中,我们将深入探讨Prim算法的原理、C++实现以及如何通过它来找到一个图的...

    Prim:Prim 编程语言,基于 Primitive Recursive 函数集

    Prim编程语言基于。 由于我一直将术语缩写为“Prim R”,因此向似乎是合理的,他的工作几乎完全无关。 警告 不要用这个。 该建议将来可能会发生变化,但此时要使用 Prim 存在一些严重的障碍。 这段代码很旧(我不...

    prim算法 代码 报告

    Prim算法是一种经典的图论算法,用于寻找加权无向图中的最小生成树。最小生成树是连接图中所有顶点的树形子图,其边的权重之和最小。这个算法由Eugene Prim在1930年提出,是解决网络设计、资源分配等实际问题的重要...

    最小生成树,Prim算法的使用(邻接矩阵实现).txt

    ### 最小生成树与Prim算法(邻接矩阵实现) #### 一、最小生成树概念 在图论中,一个无向图的生成树是该图的一个无环子图,且包含图中的所有顶点。若该图是有权图,则生成树上的边也带有相应的权重。最小生成树...

    一个使用 Prim 算法实现最小生成树的 Python 示例代码

    primMST 方法:实现 Prim 算法来计算最小生成树。 g.graph:输入的图的邻接矩阵。 g.primMST():调用 primMST 方法以计算最小生成树。 使用方法: 将上述代码保存为 minimum_spanning_tree.py。 运行 Python 文件: ...

    邻接表prim算法

    ### 邻接表Prim算法知识点解析 #### 一、Prim算法概述 Prim算法是一种用于寻找加权无向图中的最小生成树(Minimum Spanning Tree, MST)的算法。所谓最小生成树,是指在一个连通的加权无向图中找到一棵包含所有顶点...

    prim算法.zip

    Prim算法是一种在图论中用于寻找最小生成树的著名算法,由捷克数学家Vojtěch Jarník于1930年提出,后来由美国计算机科学家Robert C. Prim在1957年独立发现,因此被称为Prim算法。最小生成树问题是在一个加权无向图...

    POJ2485-Highways【Prim】

    标题中的"POJ2485-Highways【Prim】"指的是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problemset Online Judge)。这个题目要求使用Prim算法来解决,Prim算法是一种在图论中寻找最小生成树的经典算法。 ...

    C++ Prim习题答案

    C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim...

    Prim 最小生成树实现

    Prim算法是解决这个问题的一种有效方法,由捷克数学家Vojtěch Jarník在1930年提出,后来被美国计算机科学家Robert C. Prim改进并推广。 Prim算法的核心思想是贪心策略,每次从当前已构建的树中选择一条与未加入树...

    PRIM算法

    PRIM算法,也称为普里姆算法,是图论中的一种经典算法,主要用于寻找加权无向图中的最小生成树。最小生成树是一棵树形结构,包含了原图的所有顶点,且边的权重之和最小。这个算法由捷克数学家Vojtěch Jarník在1930...

    Prim最小生成树Prim最小生成树

    Prim算法是一种在图论中用于找到加权无向图的最小生成树的算法。最小生成树是连接所有图中顶点的树形子图,其边的权重之和最小。这个算法是由捷克数学家Vojtěch Jarník在1930年提出,后来由美国计算机科学家Robert...

    C++基于prim实现迷宫生成

    prim算法:随机Prim算法生成的迷宫岔路较多,整体上较为自然而又复杂,算法核心为(根据维基百科)。 1.让迷宫全是墙. 2.选一个单元格作为迷宫的通路(我一般选择起点),然后把它的邻墙放入列表 3.当列表里还有墙时...

    Prim算法 MATLAB实现_prim算法_

    Prim算法是一种经典的图论算法,主要用于寻找加权无向图中的最小生成树。这个最小生成树的概念是指在不增加边的权重的情况下,连接图中所有顶点的树形子图。Prim算法是解决这一问题的有效方法之一,尤其适用于稠密图...

    最小生成树——prim

    Prim算法是解决这个问题的一种有效方法。在本文中,我们将深入探讨Prim算法,了解其工作原理、实现步骤以及在实际问题中的应用。 Prim算法主要用于找到一个加权无向图的最小生成树,即从图中选取一组边,使得这些...

Global site tag (gtag.js) - Google Analytics