poj 3767 解题报告

本文探讨了在受到战争影响的环境下,一个商人如何通过Dijkstra算法找到从城市1到城市2的最短路径,避免两个由不同领导控制的城市间的直接联系。详细介绍了算法实现过程及其实验代码。

这道题的大意是:由于战争,一个商人想从城市1,回到自己的家城市2,其中城市1始终是由领导1,城市2始终由领导2,其中,商人回家的路中只能有一条路上连接由两个领导领导的城市,还有就是给出的路上双向的,也就是如果城市1能到城市2,那么城市2也同样能到城市1,这是关键。解题算法,最短路径,我用的是dijkstra,代码如下:

package poj; import java.util.Scanner; public class Main3767 { public static void dijkstra(int[][] GA, int[] leader, int road) { if (road == 0) System.out.println(-1); else { int size = GA.length; // System.out.println(size); int[] dist = new int[size]; int[] isUsed = new int[size]; isUsed[1] = 1; dist[1] = Integer.MAX_VALUE; for (int i = 2; i < size; i++) { dist[i] = GA[1][i]; } for (int i = 1; i < size - 2; i++) { int min = Integer.MAX_VALUE; int m = 0; for (int j = 1; j < size; ++j) { if (isUsed[j] == 0 && dist[j] < min) { min = dist[j]; m = j; } } if (m != 0) isUsed[m] = 1; else break; for (int j = 1; j < size; ++j) { if (isUsed[j] == 0 && (leader[m] == leader[j] || leader[j] == 2) && GA[m][j] != Integer.MAX_VALUE && dist[m] + GA[m][j] < dist[j]) { dist[j] = dist[m] + GA[m][j]; } } } System.out.println(dist[2] == Integer.MAX_VALUE ? -1 : dist[2]); } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextInt()) { int countCity = sc.nextInt(); if (countCity == 0) break; int road = sc.nextInt(); int[][] GA = new int[countCity + 1][countCity + 1]; for (int i = 1; i <= countCity; ++i) { for (int j = 1; j <= countCity; ++j) { GA[i][j] = Integer.MAX_VALUE; } } for (int i = 0; i < road; ++i) { int c1 = sc.nextInt(); int c2 = sc.nextInt(); GA[c1][c2] = sc.nextInt(); GA[c2][c1] = GA[c1][c2]; } int[] leader = new int[countCity + 1]; for (int i = 1; i < countCity + 1; ++i) leader[i] = sc.nextInt(); dijkstra(GA, leader, road); } } }

http://acm.pku.edu.cn/JudgeOnline/problem?id=3767

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值