[九度OJ]1008.最短路径问题
原题链接:http://ac.jobdu.com/problem.php?pid=1008
- 题目描述:
-
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
- 输入:
-
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
- 输出:
-
输出 一行有两个数, 最短距离及其花费。
- 样例输入:
-
3 2
1 2 5 6
2 3 4 5
1 3
0 0
- 样例输出:
-
9 11
- 来源:2010年浙江大学计算机及软件工程研究生机试真题
- 题解:
- 这是一道简单的最短路径问题,唯一多出的是在最短路径基础上还有最小代价的限制。采用邻接表+迪杰斯特拉算法实现。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <limits.h>
#include <stdlib.h>
using namespace std; #define MAX_VERTEX_NUM 1001
#define MAX_ARC_NUM 200001 /*******图的邻接表表示法**********/
typedef struct ArcNode
{
int adjvex; //该弧所指向顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
int dist;
int cost;
}ArcNode; typedef struct VNode
{
int dist,cost;//起始点到当前这个点的距离和花费
ArcNode *firstarc; //指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VERTEX_NUM]; typedef struct
{
AdjList vertices;//顶点数组
int vexnum;
int arcnum; //当前图的顶点数和弧数
}ALGraph; bool final[];
int a,b,d,c;
int s,t; int findNearest(ALGraph &G)
{
int i;
int min = INT_MAX;
int res = -;
int cnt=;
int arr[];
for(i = ; i<G.vexnum; i++)
if(G.vertices[i].dist<min && !final[i])
{
min = G.vertices[i].dist;
arr[cnt] = i;
cnt++;
}
min = INT_MAX;
if(cnt>)
{
for(i = ; i<cnt; i++)
if(G.vertices[arr[i]].cost<min)
{
min = G.vertices[arr[i]].cost;
res = arr[i];
}
}
return res;
}
void dij(ALGraph &G)
{
int i,w,j;
int min;
int near;
ArcNode *p,*q;
int v;
for(i = ; i<G.vexnum; i++)
G.vertices[i].dist = G.vertices[i].cost = INT_MAX; G.vertices[s-].dist = G.vertices[s-].cost = ; for (i=; i<G.vexnum;i++) //更新n-1次
{
min = INT_MAX;
near = findNearest(G);
if(near==-)
break;
final[near] = true; for (p=G.vertices[near].firstarc; p!=NULL; p=p->nextarc)
{
v = p->adjvex;
if(G.vertices[near].dist+p->dist<G.vertices[v].dist && !final[v])//更新节点
{
G.vertices[v].dist = G.vertices[near].dist+p->dist;
G.vertices[v].cost = G.vertices[near].cost+p->cost;
}
else if(G.vertices[near].dist+p->dist == G.vertices[v].dist && !final[v])//如果存在多条最短路径,更新最小花费节点
{
if(G.vertices[near].cost+p->cost<G.vertices[v].cost)
G.vertices[v].cost = G.vertices[near].cost+p->cost;
}
}
}//for
} int main()
{
// freopen("dij.in","r",stdin);
//freopen("dij.out","w",stdout);
ALGraph G;
ArcNode *p,*q;
int vexnum,arcnum;
//G = (ALGraph*)malloc(sizeof(ALGraph));
while(scanf("%d%d",&vexnum,&arcnum)!=EOF && (vexnum!= || arcnum!=) )
{
G.vexnum = vexnum;
G.arcnum = arcnum;
memset(final,,sizeof(final));
for(int i=; i<G.vexnum; i++)
G.vertices[i].firstarc = NULL;
for(int i=; i<G.arcnum; i++)
{
scanf("%d%d%d%d",&a,&b,&d,&c); if (G.vertices[a-].firstarc==NULL)
{
G.vertices[a-].firstarc = (ArcNode *)malloc(sizeof(ArcNode)); G.vertices[a-].firstarc->adjvex = b-;
G.vertices[a-].firstarc->dist = d;
G.vertices[a-].firstarc->cost = c;
G.vertices[a-].firstarc->nextarc = NULL;
}
else
{
for (p=G.vertices[a-].firstarc; p->nextarc!=NULL; p=p->nextarc); q = (ArcNode*)malloc(sizeof(ArcNode));
q->adjvex = b-;
q->dist = d;
q->cost = c;
q->nextarc = NULL; p->nextarc = q;
} }
scanf("%d%d",&s,&t);
dij(G);
printf("%d %d\n",G.vertices[t-].dist,G.vertices[t-].cost);
}
return ;
}
[九度OJ]1008.最短路径问题的更多相关文章
- 九度OJ 1008:最短路径问题 (最短路)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8064 解决:2685 题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费 ...
- 九度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. ...
- 九度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 ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
随机推荐
- gentoo装X服务器时显卡选择
前面装X服务器一直装不成功,每个步骤都按hand book上的进行,编译完成后,重启就是启动不了X服务器,最终才知道由于我是用的是 开源显卡nvidia,换成集成显卡inter后X启动成功,顺便说句, ...
- PHP学习笔记(5) - 选择一个合格的框架
作为一个合格的PHP开发框架,个人觉得起码需要满足以下几点. 一.上梁不正下梁歪,好的框架首先自身要有良好的编码规范和文件目录结构,代码要易于阅读理解. 二.为了可以更好地适应OOP,框架必须可以提供 ...
- ASP.NET Core 行军记 -----第一步(艰辛的 MVC Hello World)
现在ASP.NET Core还在不断成长.更新中,说不定到了明天又换了个模样,就如同一个小孩,从蹒跚学步,到奔向未来. 所以我们可以相应的去理解更新中所发生的变化,包容它.呵护它,而不是盲目的指责与批 ...
- csv转json文件
今天因为需要帮一个同事的新闻内容录入为html, 每次手改不方便,所以就弄了个csv(excel)转json的c++程序,然后再利用ejs把它渲染成网页,打开渲染好的网页再保存(不能保存源文件,不然还 ...
- 【Hades】ades是一个开源库,基于JPA和Spring构建,通过减少开发工作量显著的改进了数据访问层的实现
几乎每个应用系统都需要通过访问数据来完成工作.要想使用领域设计方法,你就需要为实体类定义和构建资源库来实现领域对象的持久化.目前开发人员经常使用JPA来实现持久化库.JPA让持久化变得非常容易,但是仍 ...
- ASP.NET MVC Razor视图(2)
昨天介绍了一些Razor的基本语法,几天接着向下说: 补成一个,上次介绍了怎么输出原样的文本,用<text></text>标签,下面再介绍一种语法: @{@:我爱北京} 这个 ...
- DB天气app冲刺第二天
烦躁 烦躁 很烦躁 从大早起就想做一个listview的列表 到晚上也没有做好.不知道为什么.决定明天去问问同学 .做不出来太影响心情了.虽然做出来东西的感觉是很好.. 另外觉得真的没有队友是挺孤独. ...
- SqlServer2008 设置修改表设计限制
我记起来了 SQL Server 2008 对操作的安全性进行了限制 你要在Management Studio菜单栏 -工具-选项,弹出选项窗口:把 “阻止保存要求重新创建表的更改” 请的勾去掉.
- python 进程信息
通过psutil模块读取机器进程信息: #-*- coding: UTF-8 -*-import psutil;import osimport CommMethod '''获取机器当前进程信息'''d ...
- POJ 1151 Atlantis(离散化)
点我看题目 题意 : 就是给你n个矩形的最左下角和最右上角的点的坐标,然后将这n个矩形的面积求出来. 思路 : 离散化求矩形面积并.离散化具体介绍.将横纵坐标离散开来分别存,然后排序,也可以按照黑书上 ...