E - Easy Dijkstra Problem(求最短路)

Posted acgoto

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
");
39         else printf("%d
",dis[ed]);
40     }
41     return 0;
42 }

 





以上是关于E - Easy Dijkstra Problem(求最短路)的主要内容,如果未能解决你的问题,请参考以下文章

570 div 3 E - Subsequences (easy version)

[1041] XX easy problem

codeforces-1335-E Three Blocks Palindrome

An easy problem

Easy Problem

an easy problem(贪心)