【题解】
题意:给定一个无向连通图,有k个让边权为0的机会,输出s到t的最短路。
思路:分层图最短路裸题。
【代码】
#include <bits/stdc++.h>
using namespace std;
const int maxn=1006;
typedef pair<int,int> P;
const int inf=0x3f3f3f3f;
int n,m,s,t,k;
int d[maxn][maxn];
vector <P> g[maxn];
void dij(int s)
{
memset(d,inf,sizeof(d));
d[s][0]=0;
queue <P> q;
q.push(P(s,0)); //初始情况:0条被使用
while(!q.empty()){
int u=q.front().first,w=q.front().second;
q.pop();
for(int i=0;i<g[u].size();i++){
int v=g[u][i].first,c=g[u][i].second;
if(d[u][w]+c<d[v][w]){
d[v][w]=d[u][w]+c;
q.push(P(v,w));
}
if(w<k&&d[v][w+1]>d[u][w]){
d[v][w+1]=d[u][w];
q.push(P(v,w+1));
}
}
}
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&s,&t,&k);
int u,v,c;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&c);
g[u].push_back(P(v,c));
g[v].push_back(P(u,c));
}
dij(s);
int ans=inf;
for(int i=0;i<=k;i++)
ans=min(ans,d[t][i]);
printf("%d\n",ans);
}