思路:
给最短路的dist数组加一维,表示现在是第几天(已经进过了几条边)
把最短路松弛操作改为:if (dist[x][k+1] > dist[y][k] + w[x][y]) dist[x][k+1] = dist[y][k] + w[x][y];即可。
把最短路松弛操作改为:if (dist[x][k+1] > dist[y][k] + w[x][y]) dist[x][k+1] = dist[y][k] + w[x][y];即可。
模板是spfa
#include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; int n,m,k,u,v,w; int a[25],vis[25][1005],dis[25][1005]; struct edge { int v,w; edge(int v,int w):v(v),w(w){} }; vector<edge>G[1005]; struct node//相当于原来的dis数组,只不过用结构体来表示了 { int u,day; //node(){} node(int u,int day):u(u),day(day){} }; void init(){ memset(dis,inf,sizeof(dis)); memset(vis,0,sizeof(vis)); } void dijstra() { init(); dis[0][1]=0; queue<node> q; q.push(node(1,0)); vis[0][1]=1; while(!q.empty()) { node ss=q.front(); q.pop(); vis[ss.day][ss.u]=0; int u=ss.u; for(int i=0;i<G[u].size();i++) { int v=G[u][i].v; int w=G[u][i].w; if(ss.day+1<=k&&dis[ss.day+1][v]>dis[ss.day][u]+a[ss.day+1]+w)//最短路的松弛操作 { dis[ss.day+1][v]=dis[ss.day][u]+a[ss.day+1]+w; if(!vis[ss.day+1][v]) //没有遍历过 { q.push(node(v,ss.day+1)); vis[ss.day+1][v]=1; } } } } } int main() { cin>>n>>m>>k; for(int i=1;i<=m;i++) { cin>>u>>v>>w; G[u].push_back(edge(v,w)); G[v].push_back(edge(u,w)); } for(int i=1;i<=k;i++) cin>>a[i]; dijstra(); int ans=inf; for(int i=0;i<=k;i++) ans=min(ans,dis[i][n]); printf("%d\n", ans == inf ? -1 : ans); return 0; } /* 3 3 2 1 3 10 1 2 2 2 3 2 3 7 */