洛谷 P2939 [USACO09FEB]改造路Revamping Trails

mac2022-07-05  12

#include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; const int maxn=3e6; int read() { int sum=0;char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch<='9'&&ch>='0') { sum=sum*10+ch-'0'; ch=getchar(); } return sum; } int n,m,k,dis[2*maxn],cnt,v[maxn]; int head[2*maxn],nxt[2*maxn],to[2*maxn],w[2*maxn]; void add(int x,int y,int z) { cnt++;nxt[cnt]=head[x];head[x]=cnt;to[cnt]=y;w[cnt]=z; } priority_queue<pair<int ,int > >q; void dijstra() { memset(dis,0x3f,sizeof(dis)); memset(v,0,sizeof(v)); dis[1]=0;q.push(make_pair(0,1)); while(!q.empty()) { int x=q.top().second;q.pop(); if(v[x]) continue; v[x]=1; for(int i=head[x];i;i=nxt[i]) { int y=to[i],z=w[i]; if(dis[y]>dis[x]+z) { dis[y]=dis[x]+z; q.push(make_pair(-dis[y],y)); } } } } int main() { n=read();m=read();k=read(); for(int x,y,z,i=1;i<=m;i++) { x=read();y=read();z=read(); for(int j=0;j<=k;j++) { add(x+j*n,y+j*n,z); add(y+j*n,x+j*n,z); if(j!=k) { add(x+j*n,y+(j+1)*n,0); add(y+j*n,x+(j+1)*n,0); } } } dijstra(); int ans=2147483640; for(int i=0;i<=k;i++) ans=min(ans,dis[n+i*n]); cout<<ans; return 0; }

 

最新回复(0)