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\n",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\n",num[c2],w[c2]);
    return 0;
}
堆优化dijkstra

猜你喜欢

转载自www.cnblogs.com/kongbb/p/11802139.html