bzoj2763 分层图

#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;

int n,m,k,tot,beg,end;
int h[MAXN*15],dis[MAXN*15];
bool vis[MAXN*15];

struct node{
    int from,to,next,cost;
}e[MAXN*15];

void init(){
    tot=0;
    memset(vis,false,sizeof(vis));
    memset(dis,0x7f,sizeof(dis));
    memset(h,-1,sizeof(h));
}

int zhuan(int x,int y){//x号节点第y层 
    return x+(n+1)*y;
}

void add(int x,int y,int z){
    tot++;
    e[tot].from=x;
    e[tot].to=y;
    e[tot].cost=z;
    e[tot].next=h[x];
    h[x]=tot;
}
struct node2{
    int id,num;
    bool operator<(const node2&a)const{
        return num>a.num;
    }
};


int dijkstar(){
    priority_queue<node2>q;
    q.push((node2){zhuan(beg,0),0});
    dis[zhuan(beg,0)]=0;
    while(!q.empty()){
        node2 u=q.top();q.pop();
        if(vis[u.id]==true)continue;
        vis[u.id]=true;
        for(int i=h[u.id];i!=(-1);i=e[i].next){
            if(dis[e[i].to]>u.num+e[i].cost){
                dis[e[i].to]=u.num+e[i].cost;
                q.push((node2){e[i].to,dis[e[i].to]});
            }
        }
    }
    return dis[zhuan(end,k)];
}


int main(){
    while(scanf("%d%d%d",&n,&m,&k)==3){
        init();
        cin>>beg>>end;
        for(int i=1;i<=m;i++){
            int x,y,z;cin>>x>>y>>z;
            for(int j=0;j<=k;j++){
            add(zhuan(x,j),zhuan(y,j),z);
            add(zhuan(y,j),zhuan(x,j),z);    
            }
            for(int j=0;j<k;j++){
            add(zhuan(x,j),zhuan(y,j+1),0);
            add(zhuan(y,j),zhuan(x,j+1),0);    
            }
        }
        cout<<dijkstar()<<endl;
    }
}
View Code

模板题