ACM-ICPC 2018 南京赛区网络预赛 L Magical Girl Haze (分层图最短路)

题目链接:https://nanti.jisuanke.com/t/31001

分析:分层图最短路 https://www.cnblogs.com/ywjblog/p/9270423.html

代码:

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define lowbit(x) (x&(-x))
#define mem(a,b) memset(a,b,sizeof(a))
#define FRER() freopen("in.txt","r",stdin);
#define FREW() freopen("out.txt","w",stdout);

using namespace std;

typedef pair<int,int> pii;
const int N =100000 + 7 , M = 200000 + 7, inf = 0x3f3f3f3f ;
int n,m,k,nEdge;
int nxt[M],to[M],head[M],vis[N][15];
ll val[M],d[N][15];
struct Edge{
    int u,v;
    ll w;
    bool operator < (const Edge& rhs)const{
        return w < rhs.w;
    }
}edges[M];
struct Node{
    int u;
    ll d;
    int k;
    bool operator < (const Node& rhs)const{
        return d > rhs.d;
    }
};
void AddEdge(int u,int v,ll c){
    val[nEdge] = c,to[nEdge] = v , nxt[nEdge] = head[u] , head[u] = nEdge++;
}
void Dijstra(){
    d[1][0] = 0;
    priority_queue<Node>q;
    q.push({1,0,0});
    while(!q.empty()){
        Node now = q.top();q.pop();
        int u = now.u ,kk = now.k ;
        if(vis[u][kk]) continue;
        vis[u][kk] = 1;
        for(int e=head[u];~e;e=nxt[e]){
            int v = to[e];
            if(d[u][kk] + val[e] < d[v][kk]){
                d[v][kk] = d[u][kk] + val[e];
                if(!vis[v][kk])q.push({v,d[v][kk],kk});
            }
            if(kk+1<=k&&d[u][kk] < d[v][kk+1]){
                d[v][kk+1] = d[u][kk];
                if(!vis[v][kk+1])q.push({v,d[v][kk+1],kk+1});
            }
        }
    }
}
int main(){
    //FRER();
    int T;
    scanf("%d",&T);
    while(T--){
        nEdge = 0;
        mem(d,inf);
        mem(vis,0);
        mem(head,-1);
        scanf("%d%d%d",&n,&m,&k);
        for(int i=0;i<m;i++)
            scanf("%d%d%lld",&edges[i].u,&edges[i].v,&edges[i].w);
        sort(edges,edges+m);
        AddEdge(edges[0].u,edges[0].v,edges[0].w);
        for(int i=1;i<m;i++){
            if(edges[i].u!=edges[i-1].u&&edges[i].v!=edges[i-1].v)
                AddEdge(edges[i].u,edges[i].v,edges[i].w);
        }
        Dijstra();
        ll ans = inf;
        for(int i=0;i<=k;i++)
            ans = min(ans,d[n][i]);
        printf("%lld\n",ans);
    }
}

 

posted @ 2018-09-03 21:20  dslybyme7  阅读(156)  评论(0编辑  收藏  举报