Submission #1189913

#TimeUsernameProblemLanguageResultExecution timeMemory
1189913AlgorithmWarriorCities (BOI16_cities)C++20
14 / 100
243 ms17340 KiB
#include <bits/stdc++.h>

using namespace std;

long long const INF=1e18;
int const MAX=100005;
int n,k,m;
int cities[7];
struct edge{
    int nod,len;
};
vector<edge>G[MAX];
long long dist[MAX][7];

void read(){
    cin>>n>>k>>m;
    int i;
    for(i=1;i<=k;++i)
        cin>>cities[i];
    for(i=1;i<=m;++i){
        int a,b,c;
        cin>>a>>b>>c;
        G[a].push_back({b,c});
        G[b].push_back({a,c});
    }
}

struct path{
    int nod;
    long long dst;
};

class cmp{
public:
    bool operator()(path a,path b){
        return a.dst>b.dst;
    }
};

void dijkstra(int nod,int cnt){
    int i;
    for(i=1;i<=n;++i)
        dist[i][cnt]=INF;
    dist[nod][cnt]=0;
    priority_queue<path,vector<path>,cmp>pq;
    pq.push({nod,0});
    while(!pq.empty()){
        auto [nd,dst]=pq.top();
        pq.pop();
        if(dst!=dist[nd][cnt])
            continue;
        for(auto [vec,len] : G[nd])
            if(dist[vec][cnt]>dst+len){
                dist[vec][cnt]=dst+len;
                pq.push({vec,dist[vec][cnt]});
            }
    }
}

void dijkstra_driver(){
    int i;
    for(i=1;i<=k;++i)
        dijkstra(cities[i],i);
}

void minself(long long& x,long long val){
    if(x>val)
        x=val;
}

long long solve(){
    long long ans=INF;
    int i,j;
    for(i=1;i<=n;++i){
        long long sum=0;
        for(j=1;j<=k;++j)
            sum+=dist[i][j];
        minself(ans,sum);
    }
    return ans;
}

int main()
{
    read();
    dijkstra_driver();
    cout<<solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...