当前位置: 首页 > news >正文

545E. Paths and Trees

题目链接

题意:给定一个无向图和一个点u,找出若干条边组成一个子图,要求这个子图中u到其他个点的最短距离与在原图中的相等,并且要求子图所有边的权重之和最小,求出最小值并输出子图的边号。

思路:先求一遍最短路,从所有到i点的满足最短路的边中选一条权最小的边。

Java程序

import java.io.PrintStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;

public class E545 {
    private static class Edge {
        int v;
        long w;
        int index;

        Edge(int v, long w, int index) {
            this.v = v;
            this.w = w;
            this.index = index;
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        PrintStream out = System.out;

        int n = in.nextInt(), m = in.nextInt();
        List<Edge>[] graph = new List[n];

        for (int i = 0; i < n; i++) {
            graph[i] = new ArrayList<E545.Edge>();
        }

        for (int i = 1; i <= m; i++) {
            int v1 = in.nextInt() - 1;
            int v2 = in.nextInt() - 1;
            long w = in.nextLong();

            graph[v1].add(new Edge(v2, w, i));
            graph[v2].add(new Edge(v1, w, i));
        }
        int u = in.nextInt() - 1;

        Edge[] lastEdge = new Edge[n];
        final long[] min = new long[n];
        for (int i = 0; i < n; i++) {
            min[i] = -1;
        }

        min[u] = 0;
        Queue<Integer> q = new LinkedList<Integer>();

        q.add(u);
        
        while (!q.isEmpty()) {
            int v = q.poll();
            
            for (Edge edge : graph[v]) {
                int v1 = edge.v;
                long min1 = min[v] + edge.w;

                if ((min[v1] == -1) || (min1 < min[v1])
                        || (min1 == min[v1] && edge.w < lastEdge[v1].w)) {

                    min[v1] = min1;
                    lastEdge[v1] = edge;
                    q.add(v1);
                }
            }
        }

        long res = 0;
        boolean[] f = new boolean[m];

        for (int i = 0; i < n; i++) {
            if (lastEdge[i] != null) {
                res += lastEdge[i].w;
                f[lastEdge[i].index - 1] = true;
            }
        }

        out.println(res);

        StringBuilder s = new StringBuilder();
        boolean first = true;
        for (int i = 0; i < m; i++) {
            if (f[i]) {
                if (!first) {
                    s.append(" ");
                }
                s.append(i + 1);
                first = false;
            }
        }
        out.println(s.toString());
        in.close();
        out.close();

    }

}

 

Python代码

import heapq as hq

class edge(object):
    def __init__(self, to, w, nr):
        self.to = to
        self.w = w
        self.nr = nr
        
n, m = map(int, raw_input().split())
adj = [[] for _ in range(n + 1)]
for i in range(1, m+1):
    u, v, c = map(int, raw_input().split())
    adj[u].append((v, c, i))
    adj[v].append((u, c, i))
root = int(raw_input())
vis = [False] * (n+1)
q = [(0, 0, root, 0)]
ans = []
tot = 0
while q:
    d, c, n, e = hq.heappop(q)
    if vis[n]:
        continue
    ans.append(e)
    tot += c
    vis[n] = True
    for v, c, i in adj[n]:
        if not vis[v]:
            hq.heappush(q, (d+c, c, v, i))
ans = map(str, ans)
print tot
print " ".join(ans[1:])

 

上面的代码都是在codeforces上面抄过来的,自己写不出来。。。。

转载于:https://www.cnblogs.com/theskulls/p/4716102.html

相关文章:

  • hdu 1166 敌兵布阵 ( 线段树或者树状数组)
  • WIN7 自动同步服务器上备份文件
  • swift UI特殊培训38 与滚动码ScrollView
  • Objective-C:在类中设置不同协议
  • React Native 简介:用 JavaScript 搭建 iOS 应用(2)
  • 以ASPX生成静态页
  • android获得屏幕高度和宽度
  • 项目直播:任务管理系统应用
  • 苹果电脑键盘符号记录
  • 转:Windows 8上强制Visual Studio以管理员身份运行
  • BZOJ 1047: [HAOI2007]理想的正方形( 单调队列 )
  • HDU 2955(0-1背包问题)
  • Unity Shader:Projective Texture Mapping
  • POJ-3414 Pots (BFS)
  • 台大机器学习基石课程之机器学习基本原理和概念
  • 【翻译】babel对TC39装饰器草案的实现
  • ES学习笔记(12)--Symbol
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • leetcode46 Permutation 排列组合
  • Mac转Windows的拯救指南
  • maya建模与骨骼动画快速实现人工鱼
  • PHP的类修饰符与访问修饰符
  • Redis中的lru算法实现
  • vue-loader 源码解析系列之 selector
  • vue脚手架vue-cli
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 关于for循环的简单归纳
  • 基于 Babel 的 npm 包最小化设置
  • 扑朔迷离的属性和特性【彻底弄清】
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 无服务器化是企业 IT 架构的未来吗?
  • 项目管理碎碎念系列之一:干系人管理
  • 硬币翻转问题,区间操作
  • 用Python写一份独特的元宵节祝福
  • hi-nginx-1.3.4编译安装
  • Java数据解析之JSON
  • #《AI中文版》V3 第 1 章 概述
  • #vue3 实现前端下载excel文件模板功能
  • #大学#套接字
  • #预处理和函数的对比以及条件编译
  • (1)(1.13) SiK无线电高级配置(六)
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)球球大作战
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (蓝桥杯每日一题)love
  • (区间dp) (经典例题) 石子合并
  • (十三)Maven插件解析运行机制
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)视频码率,帧率和分辨率的联系与区别
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .net连接oracle数据库