• 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
  • 相关阅读:
    点击空白处隐藏盒子
    java缓存技术
    使用Java处理大文件
    java实现把一个大文件切割成N个固定大小的文件
    笔记:Java的IO性能调整
    NIO之轻松读取大文件
    java读写文件,读超大文件
    java读取大文件 超大文件的几种方法
    java web服务器cpu占用过高的处理
    软件开发各类文档模板
  • 原文地址:https://www.cnblogs.com/kongbb/p/11802139.html
Copyright © 2020-2023  润新知