zoukankan      html  css  js  c++  java
  • PAT 1003 dijkstra

    #include        <map>
    #include      <cmath>
    #include      <queue>
    #include     <string>
    #include     <cstdio>
    #include     <vector>
    #include    <cstring>
    #include   <iostream>
    #include  <algorithm>
    using namespace std;
    #define ll long long
    const ll inf = 0x3f3f3f3f3f3f3f3f;
    const int maxn = 500+5;
    const ll mod = 1e9+7;
    int we[maxn];
    int w[maxn];
    int d[maxn];
    int g[maxn][maxn];
    int num[maxn];
    int vis[maxn];
    int n;
    void dij(int s){
        memset(d,0x3f,sizeof(d));
        d[s] = 0;
        num[s] = 1;
        w[s] = we[s];
        while(true){
            int u = -1, MIN = 0x3f3f3f3f;
            for(int j=0;j<n;j++){
                if(vis[j] == false && d[j] < MIN){
                    u = j;
                    MIN = d[j];
                }
            }
            if(u==-1)return ;
            vis[u] = true;
            for(int v=0;v<n;v++){
                if(vis[v]==false&&g[u][v]!=0x3f3f3f3f){
                    if(d[u]+g[u][v]<d[v]){
                        d[v] = d[u] + g[u][v];
                        w[v] = w[u] + we[v];
                        num[v] = num[u];
                    }else if(d[u]+g[u][v] == d[v]){
                        w[v] = max(w[v],w[u] + we[v]);
                        num[v] += num[u];
                    }
                }
            }
        }
    }
    int main(){
        int m, c1, c2;
        int u, v, l;
        memset(g,0x3f,sizeof(g));
        scanf("%d%d%d%d",&n,&m,&c1,&c2);
        for(int i=0;i<n;i++)
            scanf("%d",&we[i]);
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&u,&v,&l);
            g[u][v] = g[v][u] = l;
        }
        dij(c1);
        printf("%d %d
    ",num[c2],w[c2]);
        return 0;
    }
    dijkstra
    #include        <map>
    #include      <cmath>
    #include      <queue>
    #include     <string>
    #include     <cstdio>
    #include     <vector>
    #include    <cstring>
    #include   <iostream>
    #include  <algorithm>
    using namespace std;
    #define ll long long
    const ll inf = 0x3f3f3f3f3f3f3f3f;
    const int maxn = 500+5;
    const ll mod = 1e9+7;
    int we[maxn];
    int w[maxn];
    int d[maxn];
    int g[maxn][maxn];
    int num[maxn];
    int vis[maxn];
    int n;
    
    typedef pair<int,int>P;
    
    void dij(int s){
        memset(d,0x3f,sizeof(d));
        d[s] = 0;
        num[s] = 1;
        w[s] = we[s];
        priority_queue<P, vector<P>,greater<P>>q;
        q.push(P(0,s));
        while(!q.empty()){
            P p = q.top();q.pop();
            int v = p.second;
            if(d[v] < p.first)continue;
            for(int i=0;i<n;i++){
                if(d[i] > d[v]+g[v][i]){
                    d[i] = d[v]+g[v][i];
                    w[i] = w[v]+we[i];
                    num[i] = num[v];
                    q.push(P(d[i],i));
                }else if(d[i] == d[v]+g[v][i]){
                    num[i] += num[v];
                    w[i] = max(w[i],w[v]+we[i]);
                }
            }
        }
    }
    int main(){
        int m, c1, c2;
        int u, v, l;
        memset(g,0x3f,sizeof(g));
        scanf("%d%d%d%d",&n,&m,&c1,&c2);
        for(int i=0;i<n;i++)
            scanf("%d",&we[i]);
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&u,&v,&l);
            g[u][v] = g[v][u] = l;
        }
        dij(c1);
        printf("%d %d
    ",num[c2],w[c2]);
        return 0;
    }
    堆优化dijkstra
  • 相关阅读:
    windows中echo的用法
    通过phpMyAdmin写入MySQL,获取webshell
    底部小鱼特效
    kali Linux的简单介绍
    Kali安装gmpy2
    利用kali生成字典的三种方式
    利用kali嗅探HTTP网页用户账户密码
    永恒之蓝(ms017-010)漏洞利用
    如何使用最新Microsoft Edge打开Flash页面
    结对第二次作业
  • 原文地址:https://www.cnblogs.com/kongbb/p/11802139.html
Copyright © 2011-2022 走看看