原题链接: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. MIT 2012分布式课程基础源码解析-线程池实现

    主要内容 ScopedLock 队列实现 线程池实现 在正式讲解线程池实现之前,先讲解两个有用的工具类: ScopedLock fifo队列 ScopedLock: ScopedLock是局域锁的实现 ...

  2. IOC----LightInject

    开源项目 引入 LightInject.cs 默认服务 new ServiceContainer 注册跟获取获取服务 container.Register<IFoo, Foo>();con ...

  3. python制作安装包(setup.py)

    1.制作setup.py from distutils.core import setup setup(name='Myblog', version='1.0', description='My Bl ...

  4. PL/SQL — 存储过程

    存储过程子程序的一种类型,能够完成一些任务,作为schema对象存储于数据库.是一个有名字的PL/SQL代码块,支持接收或不接受参数,同时也支持参数输出.一个存储过程通常包含定于部分,执行部分,Exc ...

  5. BZOJ 1507 [NOI2003]Editor

    Description Input 输 入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉 ...

  6. jQuery UI dialog 的使用

    今天用到了客户端的对话框,把 jQuery UI 中的对话框学习了一下. 准备 jQuery 环境 首先,我们创建一个按钮,点击这个按钮的时候,将会弹出一个对话框. 1 <input type= ...

  7. 解决win8 plsql无法登录

    今天安装完oracle客户端,然后打开 plsql 之后,就一个提示框,提示没有登录,后来解决方法如下: 在plsql的图标上点右键,以管理员身份运行,即可! 如果不想一直点右键执行,就图标上点右键- ...

  8. 对 APM 用户的一次真实调查分析(上)

    一.前言 国内的 APM 行业这两年刚刚起步,但是在国外却比较成熟了,并且由于这两年人力成本的快速提高,国内外涌现了几家非常不错的 APM 企业,例如,OneAPM,APPdynamic,Dynami ...

  9. Python 之 使用 PIL 库做图像处理

    http://www.cnblogs.com/way_testlife/archive/2011/04/17/2019013.html Python 之 使用 PIL 库做图像处理 1. 简介. 图像 ...

  10. 转发:maven打包时始终出现以下提示:-source 1.3 中不支持泛型(请使用 -source 5 或更高版本以启用泛型)

    maven打包时始终出现以下提示: 1.-source 1.3 中不支持泛型(请使用 -source 5 或更高版本以启用泛型)List<User> userList= new Array ...