POJ 3013 Big Christmas Tree(Dijkstra+链式前向星)

版权声明:本文章未经博主允许不得转载 https://blog.csdn.net/qq_42217376/article/details/89604725

题意戳这里:https://blog.csdn.net/qq_42217376/article/details/89514327

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
using namespace std;

typedef long long LL;
typedef pair<LL,int>P;
const LL inf=0x3f3f3f3f3f3f3f3f;
const int Max_n=5e5+10;
int head[Max_n];
LL dis[Max_n],w[Max_n];
int cnt;

struct Edge{
    int to,cost;
    int next;
}edge[2*Max_n];

priority_queue<P,vector<P>,greater<P> >q;

void add(int from,int to,int cost){
    edge[cnt].to=to;
    edge[cnt].cost=cost;
    edge[cnt].next=head[from];
    head[from]=cnt++;
}

LL Dijkstra(int n){
    for(int i=1;i<=n;i++) dis[i]=inf;
    q.push(P(0,1)); dis[1]=0;
    while(!q.empty()){
        P p=q.top();q.pop();
        int v=p.second;
        if(dis[v]<p.first) continue;
        for(int i=head[v];i!=-1;i=edge[i].next){
            if(dis[edge[i].to]>dis[v]+edge[i].cost){
                dis[edge[i].to]=dis[v]+edge[i].cost;
                q.push(P(dis[edge[i].to],edge[i].to));
            }
        }
    }
    LL ans=0;
    for(int i=1;i<=n;i++){
        ans+=w[i]*dis[i];
        if(dis[i]==inf)
            return -1;
    }
    return ans;
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        cnt=0;
        int n,m;
        scanf("%d%d",&n,&m);
        memset(head,-1,sizeof(head));
        for(int i=1;i<=n;i++)
            scanf("%lld",&w[i]);
        for(int i=1;i<=m;i++){
            int from,to,cost;
            scanf("%d%d%d",&from,&to,&cost);
            add(from,to,cost);
            add(to,from,cost);
        }
        if(n==0||n==1){
            printf("0\n");
            continue;
        }
        if(m==0){
            printf("No Answer\n");
            continue;
        }
        LL ans=Dijkstra(n);
        if(ans==-1) printf("No Answer\n");
        else printf("%lld\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42217376/article/details/89604725