• 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 }
  • 相关阅读:
    定时任务
    ---Ubuntu 连接手机tethering
    ---thunar 文件浏览器的使用!
    ---recovery ui 修改
    ---wordpress 升级遇到的问题!
    ---BD PROCHOT
    ---安装/修复Ubuntu/Ach Linux efi 启动 !!!(包括双系统启动)
    ---sgdisk 分区表
    --- cache PV 丢失或损坏 怎么办
    ---lvm2分区修复问题!
  • 原文地址:https://www.cnblogs.com/acgoto/p/9340867.html
Copyright © 2020-2023  润新知