free 2019牛客暑期多校训练营(第四场)
程序员文章站
2022-04-02 18:51:44
...
题目链接:https://ac.nowcoder.com/acm/contest/884/J
可以建图后,把原图复制k+1份,叠成k+1层,对于原图,如果u和v有边,那么每两层之间,下层u连一条边到上层v,下层v连一条边到上层u,这样,从第一层S跑最短路,统计每一层T的值,取最小,就是答案。第一层的T,代表没有边被置0,第二层的T,代表一条边被置0,每上一层相当于将一条边置0,第k+1层就将k条边置0。
#include <bits/stdc++.h>
using namespace std;
const int maxN=2e6+5;
const int maxM=5e6+5;
const int inf=2e9+5;
int N,M,S,T,K;
int dis[maxN];
int head[maxN],tol;
struct Graph
{
int to,w,next;
}path[maxM];
void add(int u,int v,int w)
{
path[tol]={v,w,head[u]};
head[u]=tol++;
//path[tol]={u,w,head[v]};
//head[v]=tol++;
}
void init()
{
memset(head,-1,sizeof(head));
tol=0;
}
struct MDZZ
{
int id,val;
};
bool operator<(MDZZ a,MDZZ b)
{
return a.val>b.val;
}
void dijkstra()
{
priority_queue<MDZZ>que;
for(int i=1;i<=N*(K+1);i++)dis[i]=inf;
dis[S]=0;
que.push((MDZZ){S,0});
while(!que.empty())
{
MDZZ u=que.top();
que.pop();
for(int i=head[u.id];i!=-1;i=path[i].next)
{
int v=path[i].to;
if(dis[v]>u.val+path[i].w)
{
dis[v]=u.val+path[i].w;
que.push((MDZZ){v,dis[v]});
}
}
}
}
int main()
{
int u,v,w;
scanf("%d%d%d%d%d",&N,&M,&S,&T,&K);
init();
for(int i=1;i<=M;i++)
{
scanf("%d%d%d",&u,&v,&w);
for(int j=0;j<K;j++)
{
add(u+j*N,v+j*N,w);
add(v+j*N,u+j*N,w);
add(u+j*N,v+(j+1)*N,0);
add(v+j*N,u+(j+1)*N,0);
}
add(u+K*N,v+K*N,w);
add(v+K*N,u+K*N,w);
}
int ans=inf;
dijkstra();
for(int i=0;i<=K;i++)
{
ans=min(ans,dis[T+i*N]);
}
printf("%d",ans);
return 0;
}
上一篇: 牛客网暑期ACM多校训练营(第六场
下一篇: 牛客网暑期ACM多校训练营(第八场
推荐阅读
-
2019牛客暑期多校训练营(第二场)H Second Large Rectangle
-
2020牛客暑期多校训练营(第四场)——Basic Gcd Problem
-
2020牛客暑期多校训练营(第五场)
-
2020牛客暑期多校训练营(第九场) The Flee Plan of Groundhog
-
2020牛客暑期多校训练营Groundhog and Apple Tree(树形dp,贪心)
-
2020暑期牛客多校训练营第九场(K)The Flee Plan of Groundhog(lca,树形dp)
-
2020牛客暑期多校训练营(第二场)Cover the Tree
-
2020牛客暑期多校训练营(第一场)H-Minimum-cost Flow
-
2020牛客暑期多校 第一场 F Infinite String Comparision(字符串)
-
Harmony Pairs 2020牛客暑期多校训练营(第六场)