E - Easy Dijkstra Problem(求最短路)

Description

Determine the shortest path between the specified vertices in the graph given in the input data.
Hint: You can use Dijkstra‘s algorithm.
Hint 2: if you‘re a lazy C++ programmer, you can use set and cin/cout (with sync_with_stdio(0)) - it should suffice.

Input

first line - one integer - number of test cases For each test case the numbers V, K (number of vertices, number of edges) are given,Then K lines follow, each containing the following numbers separated by a single space:ai, bi, ci ,It means that the graph being described contains an edge from ai to bi,with a weight of ci.Below the graph description a line containing a pair of integers A, B is present.The goal is to find the shortest path from vertex A to vertex B.All numbers in the input data are integers in the range 0..10000.

Output

For each test case your program should output (in a separate line) a single number C - the length of the shortest path from vertex A to vertex B. In case there is no such path, your program should output a single word "NO" (without quotes)

Example

Input:
3
3 2
1 2 5
2 3 7
1 3
3 3
1 2 4
1 3 7
2 3 1
1 3
3 1
1 2 4
1 3

Output:
12
5
NO解题思路:坑题,WA了好几发=_=||原来题目说明的是顶点a到顶点b是一条有向边,即a-->b,而不是无向图求单源最短路,裸题(邻接矩阵)水过!AC代码:
 1 #include<iostream>
 2 #include<string.h>
 3 #include<cstdio>
 4 using namespace std;
 5 const int INF=0x3f3f3f3f;
 6 const int maxn=10005;
 7 int t,n,k,a,b,c,st,ed,dis[maxn],cost[maxn][maxn];bool flag,vis[maxn];
 8 void dijkstra(){
 9     for(int i=1;i<=n;++i)
10         dis[i]=cost[st][i];
11     dis[st]=0;vis[st]=true;
12     for(int i=1;i<n;++i){
13         int k=-1;
14         for(int j=1;j<=n;++j)
15             if(!vis[j]&&(k==-1||dis[k]>dis[j]))k=j;
16         if(dis[k]==INF){flag=true;break;}//如果此时没有最小值即为INF,说明肯定是达不到终点ed,直接退出循环
17         if(k==-1)break;
18         vis[k]=true;
19         for(int j=1;j<=n;++j)
20             if(!vis[j])dis[j]=min(dis[j],dis[k]+cost[k][j]);
21     }
22 }
23 int main(){
24     scanf("%d",&t);
25     while(t--){
26         scanf("%d%d",&n,&k);
27         for(int i=1;i<=n;++i)
28             for(int j=1;j<=n;++j)
29                 cost[i][j]=cost[j][i]=(i==j?0:INF);
30         memset(vis,false,sizeof(vis));
31         while(k--){
32             scanf("%d%d%d",&a,&b,&c);
33             cost[a][b]=min(cost[a][b],c);//去重
34         }
35         scanf("%d%d",&st,&ed);
36         flag=false;
37         dijkstra();
38         if(flag)printf("NO\n");
39         else printf("%d\n",dis[ed]);
40     }
41     return 0;
42 }

原文地址:https://www.cnblogs.com/acgoto/p/9340867.html

时间: 2024-10-10 21:45:04

E - Easy Dijkstra Problem(求最短路)的相关文章

dijkstra算法求最短路

艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学.曾在1972年获得过素有计算机科学界的诺贝尔奖之称的图灵奖,之 后,他还获得过1974年 AFIPS Harry Goode Memorial Award.1989年ACM SIGCSE计算机科学教育教学杰出贡献奖.以及2002年ACM PODC最具影响力论文奖. 艾兹格·W·迪科斯彻(Edsger

eoj1818 dijkstra求最短路及其条数

求出有n(1 < n <= 100)个结点有向图中,结点1到结点n的最短路径,以及最短路径的条数. Input 第一行有2个整数n和m( 0 < m < 3000),接下来m行每行有三个整数u,v,w结点u到v之间有一条权为w的边(w<100000). Output 输出只有一行,为结点1到结点n之间的最短路径及其条数(用空格隔开),如果1到n之间不存在路径,输出 -1 0. Sample Input 3 3 1 2 10 2 3 15 1 3 25 Sample Outpu

dijkstra,SPFA,Floyd求最短路

Dijkstra: 裸的算法,O(n^2),使用邻接矩阵: 算法思想: 定义两个集合,一开始集合1只有一个源点,集合2有剩下的点. STEP1:在集合2中找一个到源点距离最近的顶点k:min{d[k]} STEP2:把顶点k加入集合1中,同时修改集合2中的剩余顶点j的d[j]是否经过k之后变短,若变短则修改d[j]; if d[k]+a[k,j]<d[j] then   d[j]=d[k]+a[k,j]; STEP3:重复STEP1,直到集合2为空为止. #include <iostream&

Dijkstra求最短路 II

给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包含三个整数x,y,z,表示点x和点y之间存在一条有向边,边长为z. 输出格式 输出一个整数,表示1号点到n号点的最短距离. 如果路径不存在,则输出-1. 数据范围 1≤n,m≤1051≤n,m≤105,图中涉及边长均不超过10000. 输入样例: 3 3 1 2 2 2 3 1 1 3 4 输出样例

BZOJ_1001_狼抓兔子(平面图求最小割+对偶图求最短路)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 分析 平面图求最小割,转化成对偶图求最短路,经典. 注意: 1.优先队列是个大根堆. 2.Dijkstra可以带一个vis数组,也可以不带,因为一个点出来以后,它更新的的点和原本就在队列里的点都比它大,所以它不可能被更新得更小,之后这个点再出队时情况不比第一次更优,所以出队也不会有操作. 3.双向边,数组要开够(貌似不是第一次犯这个错误). 4.网上有人说m==1||n==1的情况可以

Easy Graph Problem?(一道简单图论题?) bfs + 优先队列

Easy Graph Problem? 题目抽象:给你一个n * m 的矩阵.每个格子是数字或者障碍物'*'. 第一问:从起点到终点的最短路.第二问:要求相同的方向不能连续走两次,也就是每到达一个格子,需要改变方向.问最短路.  不过不存在就输出-1. 分析:可以直接bfs搜索.第一问有一个minv[MS][MS]数组记录到达(i,j)的最短距离.第二问用flag[MS][MS][4]及记录(i,j)格子k方向是否走过. 由于2<=n,m<=500,范围较大.所以需要优先队列优化.  不然超时

hdu 5572 An Easy Physics Problem 圆+直线

An Easy Physics Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1430    Accepted Submission(s): 270 Problem Description On an infinite smooth table, there's a big round fixed cylinder an

Bzoj 1975: [Sdoi2010]魔法猪学院 dijkstra,堆,A*,K短路

1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1357  Solved: 446[Submit][Status][Discuss] Description iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与元素之间可以互相转换:能量守恒……. 能量守恒……iPig 今

POJ 3268 Silver Cow Party dijkstra单源最短路

裸dijkstra 思路:以x为源点,求到其他点的最短路,之后把邻接矩阵转置,再求一次x源 点的最短路,这样就一次是来的,一次是走的,相加迭代最大值即可 代码: /* poj 3268 8108K 47MS */ #include<cstdio> #include<iostream> #define MAXN 1005 #define MAX_INT 2147483647 using namespace std; int gra_in[MAXN][MAXN],gra_out[MAX