边数限制最短路

来源:互联网 发布:淘宝免费申请 编辑:程序博客网 时间:2024/06/04 18:36

从0到t,经过边数不超过10的最短路.

sp[i][k]代表从0到i经过k条边的最短路长度。

#include<iostream>#include<algorithm>#include<queue>#include<string.h>#include<cstdio>using namespace std;#define INF 1<<20#define MAXN 1010#define MAXH 10long d[MAXN][MAXN];long sp[MAXN][MAXH+1];long n,m,t;void init(){long i,j,a,b,c;for(i=0;i<n;i++)for(j=0;j<n;j++)d[i][j]=INF;for(i=0;i<n;i++)for(j=0;j<=MAXH;j++)sp[i][j]=INF;sp[0][0]=0;while(m--){scanf("%ld%ld%ld",&a,&b,&c);if(c<d[a][b])d[a][b]=c;if(c<d[b][a])d[b][a]=c;}}void dp(){long i,j,k;for(k=1;k<=MAXH;k++)for(i=0;i<n;i++)for(j=0;j<n;j++)if(d[j][i]<INF&&sp[j][k-1]+d[j][i]<sp[i][k])sp[i][k]=sp[j][k-1]+d[j][i];}int main(){while(scanf("%ld%ld%ld",&n,&m,&t),n){init();dp();long answer=INF;for(long i=0;i<=MAXH;i++){if(sp[t][i]<answer)answer=sp[t][i];}if(answer==INF)printf("no\n");else printf("%ld\n",answer);}return 0;}