时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:8064

解决:2685

题目描述:
给你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年浙江大学计算机及软件工程研究生机试真题

思路:

典型最短路径问题,通常有两种方法:Dijkstra和floyd算法。我比较喜欢用前一种。

最短路径算法的介绍可参见博客:http://blog.csdn.net/damenhanter/article/details/24771913

本题除了最短路径,还加上了花费,其实原理一样的。

代码:

#include <stdio.h>

#define N 1000
#define INF 1000000000 int D[N][N], P[N][N];
int visit[N], dis[N], pay[N]; void init(int n)
{
for (int i=0; i<n; i++)
{
visit[i] = 0;
for (int j=0; j<n; j++)
{
D[i][j] = INF;
P[i][j] = INF;
}
}
} void printdis(int n)
{
int i;
for (i=0; i<n-1; i++)
printf("%d ", dis[i]);
printf("%d\n", dis[i]);
} void dijkstra(int s, int n)
{
int i, j;
for (i=0; i<n; i++)
{
dis[i] = D[s][i];
pay[i] = P[s][i];
}
dis[s] = 0;
pay[s] = 0;
visit[s] = 1;
//printdis(n); int mind, minp;
int k;
for (i=0; i<n; i++)
{
mind = INF;
minp = INF;
for (j=0; j<n; j++)
{
if ( !visit[j] && (dis[j]<mind
|| dis[j]==mind && pay[j]<minp) )
{
mind = dis[j];
minp = pay[j];
k = j;
}
}
visit[k] = 1;
for (j=0; j<n; j++)
{
if ( !visit[j] && (dis[k]+D[k][j] < dis[j]
|| dis[k]+D[k][j] == dis[j] && pay[k]+P[k][j] < pay[j]) )
{
dis[j] = dis[k]+D[k][j];
pay[j] = pay[k]+P[k][j];
}
}
}
//printdis(n);
} int main(void)
{
int n, m, i;
int a, b, d, p;
int s, t; while (scanf("%d%d", &n, &m) != EOF)
{
if (n == 0 && m == 0)
break; init(n);
for(i=0; i<m; i++)
{
scanf("%d%d%d%d", &a, &b, &d, &p);
D[a-1][b-1] = D[b-1][a-1] = d;
P[a-1][b-1] = P[b-1][a-1] = p;
}
scanf("%d%d", &s, &t); dijkstra(s-1, n);
printf("%d %d\n", dis[t-1], pay[t-1]);
} return 0;
}
/**************************************************************
Problem: 1008
User: liangrx06
Language: C
Result: Accepted
Time:20 ms
Memory:8736 kb
****************************************************************/

九度OJ 1008:最短路径问题 (最短路)的更多相关文章

  1. [九度OJ]1008.最短路径问题

    原题链接:http://ac.jobdu.com/problem.php?pid=1008 题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离 ...

  2. 九度oj 题目1447:最短路

    题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线 ...

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

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

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

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

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

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

  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. RAID 1-6

    RAID 0 RAID 0亦称为带区集.它将两个以上的磁盘串联起来,成为一个大容量的磁盘.在存放数据时,分段后分散存储在这些磁盘中,因为读写时都可以并行处理,所以在所有的级别中,RAID 0的速度是最 ...

  2. Unix/Linux提权漏洞快速检测工具unix-privesc-check

    Unix/Linux提权漏洞快速检测工具unix-privesc-check   unix-privesc-check是Kali Linux自带的一款提权漏洞检测工具.它是一个Shell文件,可以检测 ...

  3. CodeForces - 258D Little Elephant and Broken Sorting

    Discription The Little Elephant loves permutations of integers from 1 to n very much. But most of al ...

  4. Jenkins里邮件插件触发器配置和Send to Developers到底是什么意思(转)

    邮件触发类型介绍(Triggers) By default, the onlytrigger configured is the "Failure" trigger.  To ad ...

  5. COFF - 中间文件格式解析

    http://www.cnblogs.com/weikanzong/p/5296739.html

  6. 如何限制Dedecms文章或产品描述的字数

    在Dedecms系统中,文章摘要(可以通过infolen或description相关标签调用)被设置了字数上限为250字符,设置上限的主要目的是减少数据库的冗余,保证网站良好的性能.因此,如果对简介内 ...

  7. ubuntu 安装花生壳

    由于无线路由的IP总是变换,所以想在机器上装一个花生壳,然后通过域名来访问这个机器,这样就算IP变了也没有关系.我的机器的系统是ubuntu 12.04 desktop  cd 到一个目录,我用的是D ...

  8. DotnetBrowser入门教程-(3)启动与使用简单的WebSocket服务

    websocket是个很好的通信协议,基本可以贯穿支持html5的所有设备.dotnetbrowser内置了对websocket服务端与客户端的支持.请看例子: 1.新建桌面项目,基于.net 4.0 ...

  9. 版本控制工具:SVN和Maven的区别

    一.只有svn的情况 首先考虑没有maven的情况.这样的话,项目组每个开发人员,都需要在本地check out所有的源码. 每次提交之前,需要先更新周边工程的代码.由于工程之间是依赖的,所以很可能需 ...

  10. freemarker中include与import的区别

    在inc1.ftl与inc2.ftl中的内容分别是: <#assign username="刘德华">与<#assign username="张学友&q ...