1. 程式人生 > >【bzoj2763】飛行路線

【bzoj2763】飛行路線

using sizeof class sin ans 比較 分層 spfa lag

這個題是前幾天做的分層圖問題,而且比較直接,多加一個維度就可以了

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
struct in
{
    int to,ne,co;
}ter[100010];
struct es
{
    int ci,d;//ci表示用了幾次免費機會,d表示在哪個店 
};
queue<es>qwq;
int n,m,k,x,y,z,s,t1,tail,head[10010
],ans[11][10010]; bool flag[11][10010];//第一維表示用了幾次免費機會,第二維表示在哪個點 inline void build(int f,int l,int c) { ter[++tail]=(in){l,head[f],c},head[f]=tail; ter[++tail]=(in){f,head[l],c},head[l]=tail; } int main() { memset(head,-1,sizeof(head)); memset(ans,127,sizeof(ans)); scanf("%d%d%d%d%d
",&n,&m,&k,&s,&t1); for(int i=1;i<=m;i++) scanf("%d%d%d",&x,&y,&z),build(x,y,z); qwq.push((es){0,s}),flag[0][s]=1,ans[0][s]=0; while(!qwq.empty())//spfa { es qaq=qwq.front(); for(int i=head[qaq.d];i!=-1;i=ter[i].ne) {
int t=ter[i].to; if(ans[qaq.ci][t]>ans[qaq.ci][qaq.d]+ter[i].co)//這是這條路不用免費機會的情況 { ans[qaq.ci][t]=ans[qaq.ci][qaq.d]+ter[i].co; if(!flag[qaq.ci][t]) flag[qaq.ci][t]=1,qwq.push((es){qaq.ci,t}); } if(qaq.ci+1<=k&&ans[qaq.ci+1][t]>ans[qaq.ci][qaq.d])//這是用的 { ans[qaq.ci+1][t]=ans[qaq.ci][qaq.d]; if(!flag[qaq.ci+1][t]) flag[qaq.ci+1][t]=1,qwq.push((es){qaq.ci+1,t}); } } qwq.pop(); flag[qaq.ci][qaq.d]=0; } printf("%d",ans[k][t1]); }

【bzoj2763】飛行路線