zoukankan      html  css  js  c++  java
  • toj 2870 理解dijstra

    题意:求离一个城市第k远的城市的编号,无负权边。

    思路:根据dijstra算法的特点可以知道,外层循环n次,每次求出的点就是离源点第i远的点的最短路。所以迭代k次,第k次新求出的点即为答案。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <cstdio>
     5 using namespace std;
     6 
     7 const int INF = 9999999;
     8 const int N = 201;
     9 const int M = 20000;
    10 int head[N];
    11 int dist[N];
    12 bool visit[N];
    13 int n, m, k, e;
    14 
    15 struct Edge
    16 {
    17     int v, next, w;
    18 } edge[M];
    19 
    20 void addEdge( int u, int v, int w )
    21 {
    22     edge[e].v = v;
    23     edge[e].w = w;
    24     edge[e].next = head[u];
    25     head[u] = e++;
    26 }
    27 
    28 int dij( int s )
    29 {
    30     memset( visit, false, sizeof(visit) );
    31     for ( int i = 0; i <= n; i++ )
    32     {
    33         dist[i] = INF;
    34     }
    35     dist[s] = 0;
    36     int u;
    37     for ( int i = 0; i <= k; i++ )
    38     {
    39         u = n;
    40         for ( int j = 0; j < n; j++ )
    41         {
    42             if ( !visit[j] && dist[j] < dist[u] )
    43             {
    44                 u = j;
    45             }
    46         }
    47         visit[u] = true;
    48         for ( int j = head[u]; j != -1; j = edge[j].next )
    49         {
    50             int v = edge[j].v, w = edge[j].w;
    51             if ( !visit[v] && dist[u] + w < dist[v] )
    52             {
    53                 dist[v] = dist[u] + w;
    54             }
    55         }
    56     }
    57     return u;
    58 }
    59 
    60 int main ()
    61 {
    62     while ( scanf("%d", &n), n )
    63     {
    64         scanf("%d", &m);
    65         e = 0;
    66         memset( head, -1, sizeof(head) );
    67         while ( m-- )
    68         {
    69             int u, v, w;
    70             scanf("%d%d%d", &u, &v, &w);
    71             addEdge( u, v, w );
    72             addEdge( v, u, w );
    73         }
    74         scanf("%d", &k);
    75         printf("%d
    ", dij(0));
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    对象
    函数3
    函数2-作用域
    事件的分类
    函数1
    简单了解JSON Web令牌(JWT)
    Pycharm激活码,2020年9月29日最新激活码
    Python基础学习之常用模块
    python详细图像仿射变换讲解
    Python如何快速复制序列?
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4667553.html
Copyright © 2011-2022 走看看