变形最短路径,最安全节点求解

来源:互联网 发布:南京淘宝美工培训班 编辑:程序博客网 时间:2024/06/05 09:50

    在这个任务中,你会发现最安全的路径,通过一个图形。

    传统的最短路径问题是在边上的,这次变形是位于节点上的。每个节点都有一个给定的概率,路径的总概率是它经过的节点的概率的乘集。

    我们的目标是找到一个乘集最高的路径

   

import java.io.BufferedReader;import java.io.FileReader;import java.io.InputStreamReader;import java.util.List;import java.util.Stack;import java.util.StringTokenizer;import java.util.ArrayList;public class Klassenavn {static Point[] ps;static Stack<Point> s = new Stack<Point>();static float _p = Float.MIN_VALUE;static String _path = "";public static String besteSti(int[][] nabomatrise, ArrayList<Float> sannsynligheter) {int s = sannsynligheter.size();ps = new Point[s];for (int i = 0; i < s; i++) {ps[i] = new Point(String.valueOf(i), sannsynligheter.get(i), new ArrayList<Point>(), false);}for (int i = 0, l = nabomatrise.length; i < l; i++) {for (int j = 0, l2 = nabomatrise[i].length; j < l2; j++) {if (1 == nabomatrise[i][j]) {ps[i].list.add(ps[j]);}}}cul(ps[0], ps[s - 1]);return _path.substring(0, _path.length() - 1);}public static void cul(Point u, Point v) {u.visited = true;s.push(u);if (u != null && u.list != null) {List<Point> temp = new ArrayList<Point>();for (Point p1 : u.list) {if (p1.visited) {continue;}if (p1.equals(v)) {s.push(v);float p = 1.f;String path = "";for (Point sp : s) {p *= sp.weight;path += (sp.n + "-");}if (_p < p) {_p = p;_path = path;}s.pop();continue;}temp.add(p1);cul(p1, v);for (Point p : temp) {p.visited = false;}}}s.pop();}public static class Point {String n;//结点名称float weight;//结点概率List<Point> list;//结点相连结点集合boolean visited;//是否被访问public Point(String n, float weight, List<Point> list, boolean visited) {super();this.n = n;this.weight = weight;this.list = list;this.visited = visited;}}public static void main(String[] args) {try {BufferedReader in = null;if (args.length > 0)in = new BufferedReader(new FileReader(args[0]));elsein = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(in.readLine());ArrayList<Float> sannsynligheter = new ArrayList<Float>();int[][] nabomatrise = new int[n][n];StringTokenizer st = new StringTokenizer(in.readLine());int i = 0, j = 0;while (st.hasMoreTokens())sannsynligheter.add(new Float(st.nextToken()));for (i = 0; i < n; i++) {st = new StringTokenizer(in.readLine());while (st.hasMoreTokens()) {nabomatrise[i][Integer.parseInt(st.nextToken())] = 1;}}System.out.println(besteSti(nabomatrise, sannsynligheter));} catch (Exception e) {e.printStackTrace();}}}

原创粉丝点击