这道题其实就是一个简单的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. codevs-1447取出整数的一部分

    说实在的,这个题目真不想写了…… 1447 取出整数的一部分 题目描述 Description 假如有一个整数(int):145678,现在我做截取该数一部份的操作,如输入4,返回前4位即1456;如 ...

  2. 【转】svn服务器IP修改后,本地怎么跟新svn同步,svn relocate 操作

    本文来源:http://www.kukaka.org/home/showonews/444 1.进入工作复本 cd ~/test 2.查看仓库地址(URL) svn info 路径: .    URL ...

  3. TKinter的常用组件

    python提供了多个图形开发界面的库,几个常用Python GUI库如下: Tkinter: Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.T ...

  4. Android拍照、录像、录音代码范例

    <p>import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import andro ...

  5. jQuery tmpl用法总结

    之前很是头疼循环数据的渲染,搞一大堆的命名,一点点的赋值,很是麻烦,今天学习了一下jQuery插件tmpl,下面抛出一些使用方法,供以后参考: 官方网址:http://web.archive.org/ ...

  6. eclipse新建web项目,运行后在tomcat安装目录下webapps中没有该项目

    一.发现问题在eclipse中新建Dynamic Web Project,配置好本地的tomcat并写好代码后选择Run on Server,但运行后发现在tomcat的安装目录下的webapps并没 ...

  7. 用Bouncy Castle的C#版API产生公钥和私钥

    开源API链接地址:The Legion of the Bouncy Castle Bouncy Castle,简称为BC,原本是java的一个开源JCE提供者,后来也提供了C#版本的API,我下载其 ...

  8. Redis资料汇总专题

    1.Redis是什么? 十五分钟介绍 Redis数据结构 Redis系统性介绍 一个很棒的Redis介绍PPT 强烈推荐!非同一般的Redis介绍 Redis之七种武器 锋利的Redis redis ...

  9. bzoj3036: 绿豆蛙的归宿

    Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度.绿豆蛙从起点出发,走向终点.到达每 ...

  10. Windows 7无线网卡启用wifi共享蓝屏!

    我的笔记本是联想Y460P,装的是Windows 7 Ultiame(x64)系统,通过设置笔记本的无线(Intel WiFi Link 1000 BGN)搭建Wifi环境并共享,使手机能够通过笔记本 ...