有边数限制的最短路(Bellman_Ford)
#include<iostream> #include<cstring> using namespace std; const int N=510,M=10010; struct Edge{ int a; int b; int w; }e[M];//把每个边保存下来即可 int dist[N]; int back[N];//备份数组放置串联 int n,m,k;//k代表最短路径最多包涵k条边 int bellman_ford(){ memset(dist,0x3f,sizeof dist); dist[1]=0; for(int i=0;i<k;i++){//k次循环 memcpy(back,dist,sizeof dist); /* back[]数组是上一次迭代后dist[]数组的备份,由于是每个点同时向外出发, 因此需要对dist[]数组进行备份,若不进行备份会因此发生串联效应,影响到下一个点*/ for(int j=0;j<m;j++){//遍历所有边 int a=e[j].a,b=e[j].b,w=e[j].w; dist[b]=min(dist[b],back[a]+w);//使用backup:避免给a更新后立马更新b,这样b一次性最短路径就多了两条边出来 } } if(dist[n]>0x3f3f3f3f/2) return -1; else return dist[n]; } int main(){ scanf("%d%d%d",&n,&m,&k); for(int i=0;i<m;i++){ int a,b,w; scanf("%d%d%d",&a,&b,&w); e[i]={a,b,w}; } int res=bellman_ford(); if(res==-1) puts("impossible"); else cout<<res; return 0; }