문제에 Luogu는 P4568 [JLOI2011] 비행 경로 솔루션

꼬꼬댁

나는이 문제는 보드 제목의 계층이다 들었어요? ?

곤약 아 배운 적이 나타내지 만 느낌은 직접 지점 분할 아 수 있습니다 (qwq \) \

하지와 \ (NOI2019 \ D1 \ T1 \ ) 헤어, 좋아 (안개)사실, 그 질문은 물 위에 데이터 때문이다

해결책

문제가 표면에서 봐, 그것은 가장 단락의 요구 사항을 명확 설명하지만, 추가적인 조건이있을 수 있습니다 \ (케이 \)는 항공편을 돈이 아닌 여행나는 확실히 그것을 같은 좋은 일이 너희를 찾을 수 없다.

데이터 범위를 찾아 \ (N \)은 매우 작고, 오직 \ (10 ^ 4 \) ; \는 (K \) 작기 만 \ (10 \) .

아주 명확해야 여기를 참조하십시오, 우리는 모든 포인트가 떨어져으로 나누어 넣어 \ (11 \)는 점은, 각각의 무료 사용 \ (0 \ 점은 \ K) 이 시점에 배 최소 거리를. \ (10 ^ 5 \) 점 데이터의 매우 짧은 정상 범위이것은 더 편안하게 보였다.

그런 다음 전송을 고려한다.

제 들어 \ (I는 \) 도시 승차 용 \ (J \) 시간의 최단 거리 (\ dis_ {I, J} = 분 (분 (dis_ {U, J-1}), 분 (dis_u, J의 + {U W_, I})) \) . (여기서 \ (U! = 내가 \) )

그런 다음 우리는 재미를 실행 할 수 있습니다 \ (익스트라 \) 을 수행합니다.

그러나 내부에 사용되는 힙의 구조 최적화에 더 많은 비용을 지불하는 \을 (세인트 \) 가 앉아했다 \ (일 \) 비행 시간은 지불하지 않습니다.

암호

#include<bits/stdc++.h>
#define del(a,i) memset(a,i,sizeof(a))
#define ll long long
#define inl inline
#define il inl void
#define it inl int
#define ill inl ll
#define re register
#define ri re int
#define rl re ll
#define mid ((l+r)>>1)
#define lowbit(x) (x&(-x))
#define INF 0x3f3f3f3f
using namespace std;
template<class T>il read(T &x){
    int f=1;char k=getchar();x=0;
    for(;k>'9'||k<'0';k=getchar()) if(k=='-') f=-1;
    for(;k>='0'&&k<='9';k=getchar()) x=(x<<3)+(x<<1)+k-'0';
    x*=f;
}
template<class T>il print(T x){
    if(x/10) print(x/10);
    putchar(x%10+'0');
}
ll mul(ll a,ll b,ll mod){long double c=1.;return (a*b-(ll)(c*a*b/mod)*mod)%mod;}
it qpow(int x,int m,int mod){
    int res=1,bas=x%mod;
    while(m){
        if(m&1) res=(res*bas)%mod;
        bas=(bas*bas)%mod,m>>=1;
    }
    return res%mod;
}
const int MAXN = 1e4+5;
int n,m,k,s,t,u,v,d,dis[11][MAXN],ans=INF,head[MAXN],num_edge;
struct Edge{
    int next,to,dis;
    Edge(){}
    Edge(int next,int to,int dis):next(next),to(to),dis(dis){}
}edge[MAXN*10];
il add_edge(int u,int v,int dis){
    edge[++num_edge]=Edge(head[u],v,dis),head[u]=num_edge;
    edge[++num_edge]=Edge(head[v],u,dis),head[v]=num_edge;
}
struct Node{
    int pos,dis,st;
    Node(){}
    Node(int pos,int dis,int st):pos(pos),dis(dis),st(st){}
    bool operator <(const Node &t) const{
        return dis>t.dis;
    }
};
bool tr[11][MAXN];
il dijkstra(int s){
    del(dis,0x3f),dis[0][s]=0;
    priority_queue<Node> q;q.push(Node(s,0,0));
    while(!q.empty()){
        Node tmp=q.top();q.pop();
        ri pos=tmp.pos,st=tmp.st;
        if(tr[st][pos]) continue;
        tr[st][pos]=1;
        for(ri i=head[pos];i;i=edge[i].next){
            if(dis[st][edge[i].to]>dis[st][pos]+edge[i].dis){
                dis[st][edge[i].to]=dis[st][pos]+edge[i].dis;
                if(!tr[st][edge[i].to]) q.push(Node(edge[i].to,dis[st][edge[i].to],st));
            }
            if(st+1<=k&&dis[st+1][edge[i].to]>dis[st][pos]){
                dis[st+1][edge[i].to]=dis[st][pos];
                if(!tr[st+1][edge[i].to]) q.push(Node(edge[i].to,dis[st+1][edge[i].to],st+1));
            }
        }
    }
}
int main()
{
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    read(n),read(m),read(k),read(s),read(t),++s,++t;
    for(ri i=1;i<=m;++i) read(u),read(v),read(d),add_edge(++u,++v,d);
    dijkstra(s);
    for(ri i=0;i<=k;++i) ans=min(ans,dis[i][t]);
    printf("%d",ans);
    return 0;
}

개요

이 문제는 일반적으로 일상적인 질문, 더 많은 문제를 할 것입니다, 그것은 마스터 할 수 있습니다 ~~

추천

출처www.cnblogs.com/TheShadow/p/11371377.html