【待修改】nyoj 38 最小生成树

package nyoj;

import java.util.Scanner;

public class Main {
    public static void main(String args[])
    {
        //System.out.println(Integer.MAX_VALUE);
        Scanner scn=new Scanner(System.in);
        int len=scn.nextInt();
        while(len-->0)
        {
            int v=scn.nextInt();
            int e=scn.nextInt();
            boolean visit[]=new boolean[v+1];//点是否被访问
            int map[][]=new int[v+1][v+1];//两个点之间的距离
            int low[]=new int[v+1];
            //读入map
            //初始化数组为无情大
            for(int i=1;i<v+1;i++)
            {
                for(int j=1;j<v+1;j++)
                {
                    map[i][j]=Integer.MAX_VALUE;
                    if(i==j)map[i][i]=0;
                }
            }
            for(int i=0;i<e;i++)
            {
                int x=scn.nextInt();
                int y=scn.nextInt();
                map[x][y]=map[y][x]=scn.nextInt();

            }
            int ans=prime(map,v,e);
            System.out.println(ans);
            int start=scn.nextInt();
            for(int i=1;i<v;i++)
            {
                int tem=scn.nextInt();
                if(tem<start)start=tem;

            }

            //System.out.println(ans+start);

        }

    }

    private static int  prime(int[][] map,int v,int e) {
        // TODO Auto-generated method stub
        boolean visit[]=new boolean[v+1];//点是否被访问
        int low[]=new int[v+1];
        visit[1]=true;
        int ans=0;
        //初始化low,就是集合到他的距离
        for(int i=1;i<=v;i++)
        {

            if(!visit[i])
            {
                low[i]=map[1][i];

            }
        }
        //不断的加点,每次加一个,共加v-1次
        for(int i=2;i<=v;i++)
        {
            //在非访问节点中选择最low的点
            int k = 0;

            int min=1<<31-1;
            for(int j=1;j<=v;j++)
            {
                if(!visit[j]&&low[j]<min) min=low[k=j];

            }
            ans+=min;//选中最小的边
            //选中k个节点
            visit[k]=true;
            //更新以k开头的点
            for(i=1;i<v+1;i++)
            {
                if(!visit[i]&&map[k][i]<low[i])
                {
                    low[i]=map[k][i];
                }

            }

        }

        return ans;

    }

}
时间: 2024-11-05 14:46:06

【待修改】nyoj 38 最小生成树的相关文章

NYOJ 38 布线问题

布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有的楼都供上电.2.所用电线花费最少 输入 第一行是一个整数n表示有n组测试数据.(n<5)每组测试数据的第一行是两个整数v,e.v表示学校里楼的总个数(v<=500)随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100).(哪两栋楼间如果没有指明花费,则表示这

待修改 nyoj 412

测试好多数据都正确,一直wrong ans 仔细思考 #include<iostream> #include<math.h> //x&-x 为x的二进制中最低位1的权值 列: 110010为 2 11100为4 ,所以 log2(4)表示最低位1在第2位 using namespace std; int lowbit(int n) { return log(n&-n)/log(2); } int main() { int n; while(cin>>n)

nyoj 38 布线问题(最小生成树 kruskal算法)

题目38 题目信息 运行结果 本题排行 讨论区 布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的楼都供上电. 2.所用电线花费最少 输入 第一行是一个整数n表示有n组测试数据.(n<5) 每组测试数据的第一行是两个整数v,e. v表示学校里楼的总个数(v<=500) 随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c

nyoj 38 布线问题【最小生成树 Kruskal】

布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的楼都供上电. 2.所用电线花费最少 输入 第一行是一个整数n表示有n组测试数据.(n<5) 每组测试数据的第一行是两个整数v,e. v表示学校里楼的总个数(v<=500) 随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100).(哪两栋楼间如果没有指明花费

nyoj 38布线问题

布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有的楼都供上电.2.所用电线花费最少 输入 第一行是一个整数n表示有n组测试数据.(n<5)每组测试数据的第一行是两个整数v,e.v表示学校里楼的总个数(v<=500)随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100).(哪两栋楼间如果没有指明花费,则表示这

NYOJ 38 布线问题_(解法1 Kruskal算法)

时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 南阳理工学院要进行用电线路改造.如今校长要求设计师设计出一种布线方式,该布线方式须要满足下面条件: 1.把全部的楼都供上电. 2.所用电线花费最少 输入 第一行是一个整数n表示有n组測试数据. (n<5) 每组測试数据的第一行是两个整数v,e. v表示学校里楼的总个数(v<=500) 随后的e行里,每行有三个整数a,b,c表示a与b之间假设建铺设线路花费为c(c<=100).(哪两栋楼间假设没有指明花费,则

NYOJ 38 布线问题_(解法2 Prim算法)

时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的楼都供上电. 2.所用电线花费最少 输入 第一行是一个整数n表示有n组测试数据.(n<5) 每组测试数据的第一行是两个整数v,e. v表示学校里楼的总个数(v<=500) 随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100).(哪两栋楼间如果没有指明花费,则表示这

最小生成树之kruskal方法实现 (java)

今天是个阴天,下了点雨,work ......... 步骤:将所有边排序,然后不断从小到大加上边,这个过程最重要的是避免环的产生,此处用并查集.(nyoj 38) 1 package 最小生成树; 2 3 import java.util.Arrays; 4 import java.util.Scanner; 5 class Node implements Comparable<Node> 6 { 7 int x; 8 int y; 9 int val; 10 public Node(int

ajax 实现修改功能

ajax 实现修改功能 这段时间在做项目,发现自己忘得好快呀,幸亏有博客园帮我记着呢,整理博客园简直不要太重要了哦  因为做的是一个内部管理系统,只用了一个主页面,所有的都不允许整个网页刷新,所以我们只能用ajax 来做,当然刚开始做也走了很多的弯路,最终还是做出来了 这点还是比较欣慰的  今天要整理一下ajax实现修改功能 这里的login登录也不写了,主要是写一下修改的大体代码,方便以后 用的时候查找  样式我用的是bootstrap,一开始要引入三个文件,这里就不多说了,下面是页面所要显示