• poj 2378 (dijkstra)


    http://poj.org/problem?id=2387

    一个dijkstra的模板题

    #include <stdio.h>
    #include <string.h>
    #define inf 999999;
    
    int graph[ 1005 ][ 1005 ];
    bool mark[ 1005 ];
    int m,n;
    
    void dijkstra()
    {
        int d[ 1005 ],k,Min;
        bool mark[ 1005 ];
        for(int i = 1 ; i <= n ; i++)       //对d[i]进行初始化
        {
            mark[ i ] = false;
            d[ i ] = graph[ 1 ][ i ];
        }
        for(int i = 1 ; i <= n ; i++)   
    { Min
    =inf; for(int j = 1 ; j <= n ; j++) { if(!mark[ j ] && d[ j ] < Min) { k = j; Min = d[ j ]; } } mark[ k ] = true; for(int j = 1 ; j <= n ; j++) { if(!mark[ j ] && d[ j ] > graph[ k ][ j ] + d[ k ]) d[ j ] = graph[ k ] [ j ] + d[ k ]; } } printf("%d ",d[n]); } int main() { int a,b,c; while(~scanf("%d%d",&m,&n)){ for(int i = 0 ; i <= n ; i++) for(int j = 0 ; j <= n ; j++) if(i == j) graph[ i ][ j ] = 0; else { graph[ i ][ j ] = inf; graph[ j ][ i ] = inf; } for(int i = 1 ; i <= m ;i++) { scanf("%d%d%d",&a,&b,&c); if(graph[ a ][ b ] > c) { graph[ a ][ b ] = c; graph[ b ][ a ] = c; } } dijkstra(); } return 0; }

    dijkstra +head

     1 const int N=405;
     2 struct rec
     3 {
     4     int v,w;//v代表所连的值,W代表权值
     5 };
     6 
     7 
     8 vector<rec> edge[N*N];
     9 int n,st,ed;
    10 long long dis[N*N];
    11 bool vis[N*N];
    12 
    13 struct cmp
    14 {
    15     bool operator()(int a,int b)
    16     {
    17         return dis[a]>dis[b];
    18     }
    19 };
    20 
    21 void Dijkstra()
    22 {
    23     priority_queue<int,vector<int>,cmp> Q;
    24     memset(dis,-1,sizeof(dis));
    25     memset(vis,0,sizeof(vis));
    26     int i,u,v;
    27     Q.push(st);
    28     dis[st]=1;
    29     while(!Q.empty())
    30     {
    31         u=Q.top();
    32         Q.pop();
    33         vis[u]=0;
    34         if(u==st)
    35             break;
    36             if(dis[v]==-1 || dis[v]<dis[u]*edge[u][i].w)
    37             {
    38                 dis[v]=dis[u]*edge[u][i].w;
    39                 if(!vis[v])
    40                 {
    41                     vis[v]=1;
    42                     Q.push(v);
    43                 }
    44             }
    45         }
    46     }
    47 }
    48         for(i=0; i<edge[u].size(); i++)
    49         {
    50             v=edge[u][i].v;
    51             if(dis[v]==-1 || dis[v]<dis[u]*edge[u][i].w)
    52             {
    53                 dis[v]=dis[u]*edge[u][i].w;
    54                 if(!vis[v])
    55                 {
    56                     vis[v]=1;
    57                     Q.push(v);
    58                 }
    59             }
    60         }
    61     }
    62 }
  • 相关阅读:
    【SQLServer】 查询一个字段里不同值的最新一条记录
    【MySQL】mysql5.7数据库的安装和配置
    【Java】JDK安装及环境变量配置
    【Oracle】SQL语句优化
    【JavaScript】 控制自适应高度
    【Java】登录验证码
    【JavaScript】 直接下载保存文件
    【Java】Java批量文件打包下载zip
    【Java】Java 单文件下载及重命名
    主机在无线网络的情况下,设置centos7.2虚拟机网络联通
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/5729933.html
Copyright © 2020-2023  润新知