这道题其实就是一个简单的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的更多相关文章

  1. 九度 OJ1008 hdu 3790

    #include<stdio.h> #include<string.h> struct node { int d; int p; }g[][]; #define inf 0x3 ...

  2. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  3. 九度OJ 1502 最大值最小化(JAVA)

    题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...

  4. 九度OJ,题目1089:数字反转

    题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...

  5. 九度 Online Judge 之《剑指 Offer》一书相关题目解答

    前段时间准备华为机试,正好之前看了一遍<剑指 Offer>,就在九度 Online Judge 上刷了书中的题目,使用的语言为 C++:只有3题没做,其他的都做了. 正如 Linus To ...

  6. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...

  7. 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...

  8. 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)

    题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...

  9. 九度OJ 1371 最小的K个数 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...

随机推荐

  1. proBuilder编辑的模型变黑

    ----更正: 旧帖中方法有误,解决不了问题. 更正确法: 将proBuilder创建的模型的Static属性由“-”改为去掉勾选:   ----旧帖 proBuilder编辑的模型变黑解法: 1,U ...

  2. 递归函数练习:输出菲波拉契(Fibonacci)数列的前N项数据

    /*====================================================================== 著名的菲波拉契(Fibonacci)数列,其第一项为0 ...

  3. Python画图形界面

    使用QTdesigner 生成.ui文件,输入命令行pyuic4 -o test.py test.ui 在生成的Python文件后面输入下面代码 if __name__=="__main__ ...

  4. Android的界面设计工具 DroidDraw

    Android的界面设计工具 DroidDraw DroidDraw 下载地址:http://code.google.com/p/droiddraw/ 如图 也可以使用在线的版本(http://www ...

  5. C#限制程序只能运行一個实例 (防多开)

    //方法一:只禁止多个进程运行 using System; using System.Collections.Generic; using System.Windows.Forms; namespac ...

  6. IOS开发—数据库的使用

    1.首先封装方法(建一个DataBase类封装) 2.实现DataBase类的方法 3.第一步先建立一个表 4.进行插入.删除.更新 插入的sql语句:@"insert into user ...

  7. 异步I/O编程实例,异步socket

    下载地址: http://files.cnblogs.com/badnewfish/RUYEESocket.rar ———————————————————————————————————————— 举 ...

  8. IntelliJ IDEA安装AngularJS插件

    Settings→Plugins→Install JetBrains plugins... 输入an后选择AngularJS,然后点击Install进行安装 按照提示重启IDEA 下图为插件管理窗口, ...

  9. android显示证书sha1

    创建证书可以用命令 keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -validity 或者andro ...

  10. Python处理Excel文档(xlrd, xlwt, xlutils)

    简介 xlrd,xlwt和xlutils是用Python处理Excel文档(*.xls)的高效率工具.其中,xlrd只能读取xls,xlwt只能新建xls(不可以修改),xlutils能将xlrd.B ...