九度题目1008:最短路径问题

题目1008:最短路径问题
时间限制:1 秒内存限制:32 兆特殊判题:否提交:5129解决:1634
题目描述:
给你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时输入结束。
(1n=1000, 0m100000, s != t)
输出:
输出 一行有两个数, 最短距离及其花费。
样例输入:
3 2
1 2 5 6
2 3 4 5
1 3
0 0
样例输出:
9 11
来源:
2010年浙江大学计算机及软件工程研究生机试真题

AC代码:

用的迪杰斯特拉最短路径算法

#include<stdio.h>
#include<string.h>
#define INF 0x11111111
int map[1010][1010],w[1010][1010];
int way[1010],value[1010],flag[1010];
int main()
{
    int i,j,n,m,x,y,z,v,s,t;
    while(scanf("%d %d",&n,&m),n!=0&&m!=0)
    {
       memset(map,INF,sizeof(map));//数组初始化为最大值
       memset(w,INF,sizeof(w));
       for(i=0;i<m;i++)
       {
          scanf("%d %d %d %d",&x,&y,&z,&v);
          map[x][y]=z;//储存正反向的路径长度和花费
          map[y][x]=z;
          w[x][y]=v;
          w[y][x]=v;
       }

       scanf("%d %d",&s,&t);

       memset(way,INF,sizeof(way));//此数组储存从s到i的长度 

       memset(value,INF,sizeof(value));//此数组储存从s到i的花费 

       memset(flag,0,sizeof(flag));//标记路径点是否被加入最短路径中 

       flag[s]=1;//起点已经被标记为加入最短路径

       for(i=1;i<=n;i++)//开始赋值
       {
          way[i]=map[s][i];
          value[i]=w[s][i];
       } 

       for(i=1;i<n;i++)
       {
          int min=INF;
          int k=0;
          for(j=1;j<=n;j++)//找出一个距离起点最近的路径
          {
             if(flag[j]==0&&(way[j]<min||(way[j]==min&&value[k]<value[j]))) //如果长度相等,取花费较小的那一个
             {
                min=way[j];
                k=j;
             }
          } 

          flag[k]=1;
          for(j=1;j<=n;j++)//找出距离刚刚选出来的点最近的距离组成新的路径
          {
             if(flag[j]==0&&(way[k]+map[k][j]<way[j]||(way[j]==way[k]+map[k][j]&&value[k]+w[k][j]<value[j])))
             {
                way[j]=way[k]+map[k][j];
                value[j]=value[k]+w[k][j];
             }
          }
       }

       printf("%d %d\n",way[t],value[t]);
    }
    return 0;
}
时间: 2024-05-18 11:52:41

九度题目1008:最短路径问题的相关文章

九度题目1120:全排列

题目1120:全排列  时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2749 解决:669 题目描述: 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列. 输入: 输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间. 输出: 输出这个字符串的所有排列方式,每行一个排列.要求字母序比较小的排列在前

九度题目1447:最短路

题目1447:最短路 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:1650 解决:798 题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? 输入: 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场

九度题目1110:小白鼠排队

题目1110:小白鼠排队 时间限制:1 秒内存限制:32 兆特殊判题:否提交:1348解决:820 题目描述: N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用"red","blue"等字符串来表示.不同的小白鼠可以戴相同颜色的帽子.白鼠的重量用整数表示. 输入: 多案例输入,每个案例的输入第一行为一个整数N,表示小白鼠的数目. 下面有N行

九度题目1188:约瑟夫环

题目1188:约瑟夫环 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1500 解决:665 题目描述:     N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的 人再从1.2.3开始报数,报p的人再退出圈外,以此类推.     请按退出顺序输出每个退出人的原序号. 输入: 包括一个整数N(1<=N<=3000)及一个整数p. 输出: 测试数据可能有多组,对于每一组数据, 按退出顺序输出每个退出人的原序号. 样例输入: 7 3 样例输出:

九度题目1009:二叉搜索树

题目1009:二叉搜索树 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4308 解决:1919 题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出: 如果序列相同则输出YES

九度题目1201:二叉排序树

题目1201:二叉排序树 时间限制:1 秒内存限制:32 兆特殊判题:否提交:3008解决:1262 题目描述:     输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历. 输入:     输入第一行包括一个整数n(1=n=100).     接下来的一行包括n个整数. 输出:     可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序.中序和后序遍历.     每种遍历结果输出一行.每行最后一个数据之后有一个空格. 样例输入: 5 1 6 5

九度题目1363:欢乐斗地主

欢乐斗地主 时间限制:1 秒内存限制:32 兆特殊判题:否提交:727解决:163 题目描述:               如果大家玩过欢乐斗地主这个游戏,就一定知道有一个具有"提示"功能的按钮.如果你不知道你现在手 里的牌有没有比上家大的牌,并且你也懒得去一张一张地看你手中的牌.这时候你就可以点"提示"按钮,系 统会告诉你是否有这样的牌.          如果你是一个喜欢挑战的人,你就一定会想,能不能写一个程序,让它实现欢乐斗地主中的"提示"

九度题目1027:欧拉回路

题目1027:欧拉回路 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2344解决:1157 题目描述:     欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? 输入:     测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M:随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号).当N为0时输入结束. 输出:

九度题目1153:括号匹配问题

题目1153:括号匹配问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2965 解决:1315 题目描述:     在某个字符串(长度不超过100)中有左括号.右括号和大小写字母:规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右 边且距离最近的右括号匹配.写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号.不能匹配的 左括号用"$"标注,不能匹配的右括号用"?"标注. 输入:     输入包括多组数据,