POJ-3268(来回最短路+dijkstra算法)
Silver Cow Party
POJ-3268
- 这题也是最短路的模板题,只不过需要进行两次求解最短路,因为涉及到来回的最短路之和。
- 该题的求解关键是:求解B-A的最短路时,可以看做A是起点,这就和求解A-B的最短路很类似了,只不过需要将单向路的距离调换一下即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int INF = 1111111111;
int w[1001][1001];//d[i][j]表示i到j的距离
int d[1001];//d[i]表示s到i的最短近距离
int v[1001];//v[i]表示是否被访问过
int n;//表示顶点数
void dijkstra(int s) {
for (int i = 0; i<n; i++) {
if (i == s)
d[i] = 0;
else
d[i] = INF;
}
memset(v, 0, sizeof(v));
for (int i = 0; i<n; i++) {
int x, m = INF;
for (int y = 0; y<n; y++)
if (!v[y] && d[y] <= m)
m = d[x = y];
v[x] = 1;
for (int y = 0; y<n; y++)
d[y] = min(d[y], d[x] + w[x][y]);
}
}
int main() {
int m, x;
cin >> n >> m >> x;
int a, b;
int weight;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
w[i][j] = INF;
if (i == j)
w[i][j] = 0;
}
}
for (int i = 0; i < m; i++) {
cin >> a >> b>>weight;
w[a-1][b-1] = weight;
}
dijkstra(x - 1);
int to[1001];
int back[1001];
for (int i = 0; i < n; i++)
back[i] = d[i];
/*for (int i = 0; i < n; i++) {
dijkstra(i);
to[i] = d[x - 1];
}*/
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
int temp = w[i][j];
w[i][j] = w[j][i];
w[j][i] = temp;
}
}
dijkstra(x - 1);
int max=0, max_i=0;
for (int i = 0; i < n; i++) {
if (max < d[i] + back[i]) {
max = d[i] + back[i];
max_i = i;
}
}
cout << max << endl;
return 0;
}
JAVA:
package POJ;
import java.util.*;
public class POJ_3268 {
static int n,m,x;//n:1000,m:100000
static final int INF = 1111111111;
static int [][]w;//d[i][j]表示i到j的距离
static int []d;//d[i]表示s到i的最短近距离
static int []v;//v[i]表示是否被访问过
static void dijkstra(int s) {
for (int i = 0; i<n; i++) {
if (i == s)
d[i] = 0;
else
d[i] = INF;
}
Arrays.fill(v, 0);//这里很重要,因为v曾经改变过
for (int i = 0; i<n; i++) {
int x=0, m = INF;
for (int y = 0; y<n; y++)
if (v[y]==0 && d[y] <= m)
m = d[x = y];
v[x] = 1;
for (int y = 0; y<n; y++)
d[y] = Math.min(d[y], d[x] + w[x][y]);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner(System.in);
n=cin.nextInt();m=cin.nextInt();x=cin.nextInt();
w=new int[n][n];
d=new int[n];
v=new int[n];
int a, b;
int weight;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
w[i][j] = INF;
if (i == j)
w[i][j] = 0;
}
}
for (int i = 0; i < m; i++) {
a=cin.nextInt();b=cin.nextInt();weight=cin.nextInt();
w[a-1][b-1] = weight;
}
dijkstra(x - 1);
int []to=new int[n];
int []back=new int[n];
for (int i = 0; i < n; i++)
back[i] = d[i];
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
int temp = w[i][j];
w[i][j] = w[j][i];
w[j][i] = temp;
}
}
dijkstra(x - 1);
int max=0, max_i=0;
for (int i = 0; i < n; i++) {
if (max < d[i] + back[i]) {
max = d[i] + back[i];
max_i = i;
}
}
System.out.println(max);
}
}
POJ-3268(来回最短路+dijkstra算法)的更多相关文章
- 单源最短路dijkstra算法&&优化史
一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...
- 最短路Dijkstra算法的一些扩展问题
最短路Dijkstra算法的一些扩展问题 很早以前写过关于A*求k短路的文章,那时候还不明白为什么还可以把所有点重复的放入堆中,只知道那样求出来的就是对的.知其然不知其所以然是件容易引发伤痛的 ...
- POJ 3268 Silver Cow Party 最短路—dijkstra算法的优化。
POJ 3268 Silver Cow Party Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbe ...
- 【POJ - 3268 】Silver Cow Party (最短路 Dijkstra算法)
Silver Cow Party Descriptions 给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x, ...
- ACM: HDU 2544 最短路-Dijkstra算法
HDU 2544最短路 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descrip ...
- 单源最短路Dijkstra算法——matlab实现
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...
- hdu2544 最短路 Dijkstra算法
最短路(Dijkstra算法模板题) Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 单源最短路(Dijkstra算法)
#返回上一级 @Author: 张海拔 @Update: 2015-03-11 @Link: http://www.cnblogs.com/zhanghaiba/p/3514570.html Dijk ...
- 单源最短路——dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问 ...
随机推荐
- 记一次Python调试问题
C#调用python脚本错误: 使用cmd直接运行脚本报错: TabError: inconsistent use of tabs and spaces in indentation 查看日志报错: ...
- .net中swagger忽略某些字段
需要忽略的字段上用特性 [System.Text.Json.Serialization.JsonIgnore] 例如:
- XV6学习(16)Lab net: Network stack
最后一个实验了,代码在Github上. 这一个实验其实挺简单的,就是要实现网卡的e1000_transmit和e1000_recv函数.不过看以前的实验好像还要实现上层socket相关的代码,今年就只 ...
- VXLAN学习之路-结合VRF在Linux中实践VXLAN网络
一.概述 近期在在搞网络安全HCIE.CISP的认证的事,顺便将VXLAN技术再次系统的学习一下,学习过程中看到云原生实验室里的一篇文章,就是关于VXLAN在Linux系统中的实践,感觉文章写得很好, ...
- NIST随机数测试软件安装与使用 && igamc:UNDERFLOW
https://csrc.nist.gov/ https://csrc.nist.gov/projects/random-bit-generation/documentation-and-softwa ...
- 地址解析协议ARP与逆地址解析协议RARP
IP地址是用来通信的,但是和硬件地址是有区别的.物理地址是数据链路层和物理层使用的地址,IP地址是网络层及以上各层使用的地址. 发送数据时,数据从高层向下层传输,使用IP地址的IP数据报交给下层的数据 ...
- C语言经典面试题
[题目]零值比较--BOOL,int,float,指针变量与零值比较的if语句. (首先给个提示:题目中要求的是零值比较,而非与0进行比较,在C++里"零值"的范围可就大了,可以是 ...
- ZOJ 3430 Detect the Virus(AC自动机 + 模拟)题解
题意:问你主串有几种模式串.但是所有串都是加密的,先解码.解码过程为:先把串按照他给的映射表变成6位数二进制数,然后首尾衔接变成二进制长串,再8位8位取变成新的数,不够的补0.因为最多可能到255,所 ...
- windows信息收集
导语:介绍 特权升级总是被归结为适当的枚举.但要完成适当的枚举,你需要知道要检查和查找的内容.这通常需要伴随着经验的丰富而对系统非常熟悉.起初特权升级看起来像是一项艰巨的任务,但过了一段时间,你就 ...
- TypeScript enum 枚举实现原理
TypeScript enum 枚举实现原理 反向映射 https://www.typescriptlang.org/docs/handbook/enums.html enum Direction { ...