zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    03 JVM 从入门到实战 | 简述垃圾回收算法
    02 JVM 从入门到实战 | 什么样的对象需要被 GC
    01 JVM 从入门到实战 | 什么是 JVM
    从一道面试题探究 Integer 的实现
    程序员如何写一份更好的简历
    自己动手实现分布式任务调度框架(续)
    一个excel(20M)就能干趴你的poi,你信吗?
    一个普通类就能干趴你的springboot,你信吗?
    自己动手实现springboot配置(非)中心
    自己动手实现分布式任务调度框架
  • 原文地址:https://www.cnblogs.com/acgoto/p/9340867.html
Copyright © 2011-2022 走看看