`
200830740306
  • 浏览: 106366 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

poj1125 最短路径

阅读更多
问题重述
描述
众所周知,证券经纪业依靠的就是过度的传言。您需要想出股票经纪人中传播假情报的方法,让您的雇主在股票市场的占据优势。为了获得最大的效果,你必须蔓延最快的方式谣言。
不幸的是你,股票经纪人信息只信任他们的“可靠来源”,这意味着你在你传播谣言之前必须考虑到他们的接触结构。它需要特定股票经纪人和一定的时间把谣言传递给他的每一位同事。你的任务将是写一个程序,告诉您选择哪一个股票经纪人作为谣言的出发点和所花费多少时间将谣言扩散到整个社会的股票经纪人。这一期限是衡量过去的人收到信息所需的时间。
输入
你的程序包含多组股票经纪人的输入数据。每组以股票经纪人的人数开始。接下来的几行是每个经纪人与其他人接触的一些信息,包括这些人都是谁,以及将讯息传达到他们所需的时间。每个经纪人与其他人接触信息的格式如下:开头的第一个数表示共有n个联系人,接下来就有n对整数。每对整数列出的第一个数字指的是一个联系人(例如,一个'1'是指编号1的人),其次是在传递一个信息给那个人时所采取分钟的时间。没有特殊的标点符号或空格规则。
每个人的编号为1至经纪人数目。所花费的传递时间是从1到10分钟(含10分种)。股票经纪的人数范围是从1到100。当输入股票经纪人的人数为0时,程序终止。
输出
在对于每一组数据,你的程序必须输出一行,包括的信息有传输速度最快的人,谁的成果,以及早在最后一个人将会收到任何消息后,把它送给你这个人,在整数分钟计算。
你的程序可能会收到的一些关系会排除一些人,也就是有些人可能无法访问。如果你的程序检测到这样一个破碎的网络,只需输出消息“disjoint”。请注意,所花费的时间是从A传递消息到B,B传递信息到A不一定是花费同样的传递时间,但此类传播也是可能的。
Sample Input
3
2 2 4 3 5
2 1 2 3 6
2 1 2 2 2
5
3 4 4 2 8 5 3
1 5 8
4 1 6 4 10 2 7 5 2
0
2 2 5 1 5
0
Sample Output

3 2
3 10
解题过程:
分析过程:
虽然一开始就知道这是一道最短路径问题,但是对于题目的理解还是需要再细看下才行。对于最短路径,很显然有两种方法,一种是迪杰斯特拉,另外一种是弗洛依德,很显然,这道题中的Stockbrokers相互给信任他的人传递信息,形成了一张信息传递网络。而题目是要找出以谁为信息源,能使信息传播最快。故这是一个任意两点最路径问题的应用。用弗洛依德的话,效率会高一点。只要在任一Stockbroker传递信息到其他Stockbroker的最短时间的集合中,找出最大的时间,该时间就表示这一Stockbroker传递信息让其他人都知道所要花费的时间。然后在比较任一Stockbroker所花费的时间,找出最少的,就是所要求的信息源和最少花费时间。至于数据的存储,就用邻接矩阵,只要对矩阵上的时间进行修改就行了,相对比较方便。
编程过程:
这道题理解题意后就不难了。代码的编写也比较容易。只是初始化和单个顶点的环注意下就行了
做题收获:
对求最短路径的掌握更熟练了。
4.程序源码:
package middle;


import java.io.BufferedInputStream;
import java.util.Scanner;


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 * 求最短路径
 * 有两种方法。用弗洛德相对简单点
 * 这道题理解题意后就不难了。代码的编写也比较容易。
 * 只是初始化和单个顶点的环注意下就行了
 * poj1125
 * @author NC
 */
public class Poj1125 {

    final static int disjoint = 1000;//最多100个人,每个人最多花费10分钟

    public static void main(String[] args) {
        Scanner scan = new Scanner(new BufferedInputStream(System.in));
        while (scan.hasNext()) {
            int n = scan.nextInt();
            if (n == 0) {
                break;
            }
            //初始化矩阵,默认不可达,stockbroker的编号是从1开始的
            int[][] times = new int[n + 1][n + 1];
            for (int i = 0; i < n + 1; i++) {
                for (int j = 0; j < n + 1; j++) {
                    times[i][j] = disjoint;
                }
            }
            for (int i = 1; i <= n; i++) {
                int stockbroker = i;
                int number = scan.nextInt();
                for (int j = 1; j <= number; j++) {
                    int contact = scan.nextInt();
                    int time = scan.nextInt();
                    times[stockbroker][contact] = time;
                }
            }
            //弗洛依德算法,顶点i到j经过k点
            for (int k = 1; k <= n; k++) {
                for (int i = 1; i <= n; i++) {
                    for (int j = 1; j <= n; j++) {
                        if (i != j && times[i][k] + times[k][j] < times[i][j]) {
                            times[i][j] = times[i][k] + times[k][j];
                        }
                    }
                }
            }
            //注意,单个顶点本身不应该有环,这里是无穷大
            //求每个经纪人将信息传递给所有人知道所要花费的时间,存储在第0列
            for (int i = 1; i <= n; i++) {
                times[i][0] = 0;//赋0方便比较大小
                for (int j = 1; j <= n; j++) {
                    if (times[i][j] > times[i][0] && i != j) {//求max
                        times[i][0] = times[i][j];
                    }
                }
            }
            //找出最小耗时,存在第0行第0列
            int index = 0;
            for (int i = 1; i <= n; i++) {
                if (times[i][0] < times[0][0] && times[i][0] != disjoint) {//求min
                    times[0][0] = times[i][0];
                    index = i;
                }
            }
            //输出结果
            if (index == 0) {
                System.out.println("disjoint");
            } else {
                System.out.println(index + " " + times[0][0]);
            }
        }
    }
}

分享到:
评论

相关推荐

    poj1125原创AC代码

    poj1125原创AC代码,用的是folyd算法,求出所有点之间的最短路径,再以此求出每个点到其他点的最长路径。。。

    poj题目分类

    * 最短路径算法:例如 Dijkstra、Bellman-Ford、Floyd、Heap+Dijkstra,例如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最小生成树算法:例如 Prim、Kruskal,例如 poj1789、poj2485、poj1258、...

    北大oj 题目分类

    (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3259,poj1062,poj2253,poj1125,poj2240) (3)最小生成树算法(prim,kruskal) (poj1789,poj2485,poj1258,poj3026) (4)拓扑排序 (poj...

    poj 1062 昂贵的聘礼 代码

    poj 1062 昂贵的聘礼 代码 单源最短路径的Dijkstra算法

    pku acm 2253 Frogger 代码

    pku acm 2253 Frogger 代码 单元最短路径 Dijkstra算法

    ACM 比赛 POJ的训练计划,,,非常不错,关键在于坚持

    然后,需要学习图算法,如深度优先遍历、广度优先遍历、最短路径算法和最小生成树算法等。最后,需要学习数据结构,如串、排序、堆和哈希表等。 ACM 比赛 POJ 训练计划旨在帮助选手提高算法和数据结构的能力,涵盖...

    poj-solve:算法练习

    Algorithm-Java Algorithms + Data Structures = Programs....最短路径(dijkstra,bellman-ford,floyd,heap+dijkstra)(,,poj1062,poj2253,poj1125,poj2240) 最小生成树(prim,kruskal)(p

    leetcode打不开-codeBook:为了好玩,永远

    最短路径的 BFS,并递归地追溯路径。 解决这个问题我想起了很多:如何定义mutli-dim vector,如何定义队列,如何定义struct数组,如何定义方向,如何编写BFS,如何跟踪路径。 请注意,BFS 本身不是递归实现的(相反...

    leetcodeoj和leetcode-OJcodes:我的leetcode、nowcoder和VirtualJudge代码

    自己总结的一些算法代码模板,有基本的排序算法、图最短路径算法,也有树状数组、线段树这些骚操作. /nowcoder/coding-interviews/ 牛客网上《剑指offer》编程题C++代码,比该书的参考代码要简明许多,更加OJ风格. /...

    浙江大学ACM模板 计算几何,图论,数据结构,经典题的模板

    8.9 最短路径 173 8.10 最大网络流 175 8.11 最小费用流 180 8.12 最大团问题 182 8.13 二分图匹配 184 8.14 带权的最优二分图匹配 184 9.搜索算法概略 187 9.1 迭代深搜+IDA* 187 9.2 分之界限法(深搜) 189 9.3 A...

    leetcode中国-ACAG-Code:《算法竞赛进阶指南》(AlgorithmCompetitionAdvancedGuide)中例题和习

    0103】最短Hamilton路径 最短Hamilton路径 Accepted 2018.07.23 【CH 0201】费解的开关 开关问题 Accepted 2018.07.23 【POJ 1958】Strange Towers of Hanoi 增强汉诺塔 Accepted 2018.07.23 【BZOJ 1218】激光炸弹 ...

Global site tag (gtag.js) - Google Analytics