原题链接: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.最短路径问题的更多相关文章

  1. 九度OJ 1008:最短路径问题 (最短路)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8064 解决:2685 题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费 ...

  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. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

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

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

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

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

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

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

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

  9. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

随机推荐

  1. Java学习-Overload和Override的区别

    1.Overload是重载的意思,Override是覆盖的意思,也就是重写. 2.重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同). 3 ...

  2. uCOS-II任务的挂起和恢复

    函数描述 OSTaskSuspend() 功能描述:无条件挂起一个任务.调用此函数的任务也可以传递参数OS_PRIO_SELF,挂起调用任务本身.函数原型:INT8U OSTaskSuspend ( ...

  3. 【gitlab】版本管理工具

  4. hdu 1403 Longest Common Substring(最长公共子字符串)(后缀数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=1403 Longest Common Substring Time Limit: 8000/4000 MS (Ja ...

  5. linux运维面试题

    一.有文件file1 1.查询file1 里面空行的所在行号 grep -n "^#" file1 or awk ‗{if($0~/^$/)print NR}‘ file or g ...

  6. Linux的直接I/O机制

    转自Linux的直接I/O机制 对于传统的操作系统来说,普通的 I/O 操作一般会被内核缓存,这种 I/O 被称作缓存 I/O.本文所介绍的文件访问机制不经过操作系统内核的缓存,数据直接在磁盘和应用程 ...

  7. android 监听去电实现ip拨号 广播接收者

    利用广播实现ip拨号 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...

  8. SpeedPHP关于一对一和一对多关联关系的建立 model建立

    新闻表:t_news 新闻类型表:b_type_to_name 其中一个新闻类型可以包含多个新闻(hasmany),一个新闻只能属于一种新闻类型(hasone) 下面是新闻model类: <?p ...

  9. Memcached总结一:memcached简介及适用和不适应场景

    Memcached是免费的,开源的,高性能的,分布式内存对象的缓存系统(键/值字典),旨在通过减轻数据库负载加快动态Web应用程序的使用. Memcached是由布拉德·菲茨帕特里克(Brad Fit ...

  10. Java二维数组

    package com.test; public class Test { public static void main(String[] args) { // TODO Auto-generate ...