九度OJ1008
这道题其实就是一个简单的Dijkstra变形,只是要考虑重边的情况。
当在更新图中点到起点的距离时,将花费p也计算在内;如果长度与之前计算的值相等,则再考虑此时花费p是否会更少,是的话则仍然要更新最短路径。
我一开始想的是跑一遍迪杰斯特拉,记录下最短路的重边,然后再根据重边构建一个新的图,图中的权值则是花费p,再以此跑一遍Dijkstra,则就能得到题目要求的情况。这样理论上能做,但实现起来很麻烦,不如上面提到的简单。
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include<string.h>
#define INF 1<<30
using std::vector;
int n,m,graph[][][],s,t,D[],P[];
bool visited[];
//vector<int> p[1001];
void Dijkstra()
{
int i,j;
//visited[s]=1;
for(i=;i<=n;i++)
{
D[i]=INF;
P[i]=INF;
}
P[s]=;
D[s]=;
for(j=;j<=n;j++)
{
int min=INF;
int k=-;
for(i=;i<=n;i++)
{
if(visited[i]==&&min>D[i])
{
min=D[i];
k=i;
}
}
if(k!=-)
{
visited[k]=;
for(i=;i<=n;i++)
{
if(visited[i]==&&D[i]>=D[k]+graph[][k][i])
{
if(D[i]>D[k]+graph[][k][i])
{
D[i]=D[k]+graph[][k][i];
P[i]=P[k]+graph[][k][i];
//printf("%d %d %d\n",i,D[type][i],P[i]);
}
else if(D[i]==D[k]+graph[][k][i]&&P[i]>P[k]+graph[][k][i])
{
P[i]=P[k]+graph[][k][i];
}
}
}
}
}
}
int main()
{
int i,j;
//printf("%d\n",INF);
scanf("%d%d",&n,&m);
while(!(n==&&m==))
{
int a,d,b,p1;
memset(visited,,sizeof(visited));
for(i=;i<=n;i++)
for(j=;j<=n;j++)
{
if(i==j)
{
graph[][i][j]=;
graph[][i][j]=;
}
else
{
graph[][i][j]=INF;
graph[][i][j]=INF;
}
}
for(i=;i<=m;i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p1);
graph[][a][b]=d;
graph[][b][a]=d;
graph[][a][b]=p1;
graph[][b][a]=p1;
}
scanf("%d%d",&s,&t);
Dijkstra();
printf("%d %d\n",D[t],P[t]);
scanf("%d%d",&n,&m);
}
return ;
}
九度OJ1008的更多相关文章
- 九度 OJ1008 hdu 3790
#include<stdio.h> #include<string.h> struct node { int d; int p; }g[][]; #define inf 0x3 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ 1502 最大值最小化(JAVA)
题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...
- 九度OJ,题目1089:数字反转
题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...
- 九度 Online Judge 之《剑指 Offer》一书相关题目解答
前段时间准备华为机试,正好之前看了一遍<剑指 Offer>,就在九度 Online Judge 上刷了书中的题目,使用的语言为 C++:只有3题没做,其他的都做了. 正如 Linus To ...
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...
- 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...
- 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)
题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...
- 九度OJ 1371 最小的K个数 -- 堆排序
题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...
随机推荐
- android 添加依赖的库文件
Notpad: 2016-3-16: 1.android 添加依赖的库文件 右键自己的项目 -> properties ->android ->在Library处点击add -> ...
- hibernate的工作原理
hibernate的工作原理1.Hibernate 的初始化.读取Hibernate 的配置信息-〉创建Session Factory1)创建Configeration类的实例.它的构造方法:将配置信 ...
- Character 比较注意先要转换成字符串类型
Character tmp = '/'; if("/".equals(tmp)){ System.out.print("error"); } if(" ...
- Hadoop常见错误解决
1. 通过命令和查看日志文件查看hadoop启动和运行情况 在NameNode端,可以通过 tail -100 /var/log/hadoop/hadoop/hadoop-hadoop-namenod ...
- [原]在Fedora 20环境下安装系统内核源代码
1.安装Kernel Headers(头文件) 通过安装kernel-devel RPM包就可以得到Kernel Headers,但默认情况下没有被Fedora 20安装.通过DVD ISO 或者 y ...
- DecimalFormat--格式化十进制数字
java.text.Format java.text.DateFormat java.text.Simp ...
- WPF--Calendar控件高级使用
一.得到当前显示的月份: DateTime SelectedDay = this.MC.DisplayDate; 二.得到当前选中的天,得到当前选中的周,得到当前显示的月份: 如果你使用系统默认的事件 ...
- Js获取当前日期时间
Js获取当前日期时间 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4 ...
- svn 同步脚本
REPOS="$1"REV="$2"export LANG=en_US.UTF-8/usr/bin/svn update /home/wwwroot/yswif ...
- 黄聪:WordPress 函数:apply_filters()(创建过滤器)
apply_filters() 函数用来创建一个过滤器,大多数被用在函数中,是 WordPress 插件机制中非常重要的一个函数,能让其它的主题和插件对一个值进行修改过滤. 用法 apply_filt ...