Meaning of the questions:
Seeking the shortest path, but you have the opportunity to k times the length of an edge path becomes zero.
answer:
K + 1 times run Dijkstra, Imagine an array of k + 1 group and dis priority queue, it means removing the k-th group of k edges, the relaxation operation every two i, relaxation, j, and the distance l (i, j), not only the present update dis array group so dis [j] = dis [i] + l [i, j], further updating of the next group, so dis` [j] = dis [i] , equivalent to deleting the edge (i, j)
#include<iostream> #include<queue> #include<vector> #include<cstring> #define INF 0x3f3f3f3f struct Point{ int n,dis; friend bool operator >(const Point &a,const Point &b){ return a.dis>b.dis; } friend bool operator <(const Point &a,const Point &b){ return a.dis<b.dis; } Point(){} Point (intA, int B) { n- = A; DIS = B; } }; the using namespace STD; int Lik [ 1003 ] [ 1003 ]; int DIS [ 1003 ] [ 1003 ]; // deleted after a j i edges points shortest distance The priority_queue <point, Vector <point>, Greater <point>> que [ 1003 ]; Vector <point> Link [ 1003 ]; int main () { int n-, m, S, T, K; Scanf ( " % D%% D D D% D% " , & n-, & m, & S, T &, & K); Memset (DIS, INF,sizeof dis); memset(lik,INF,sizeof lik); for(int i=1;i<=m;i++){ int a,b,c; scanf("%d %d %d",&a,&b,&c); if(a==b)continue; else{ lik[a][b]=min(lik[a][b],c); lik[b][a]=min(lik[b][a],c); } } // for(int i=1;i<=n;i++){ // for(int j=1;j<=n;j++){ // printf("%d ",lik[i][j]); // } // printf("\n"); // } for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ if(lik[i][j]<INF){ link[i].push_back(Point(j,lik[i][j])); link[j].push_back(Point(i,lik[j][i])); } } } // for(int i=1;i<=n;i++)printf("%d ",link[i].size()); // system("pause"); que[0].push(Point(s,0)); dis[0][s]=0; for(int i=0;i<=k;i++){ while(!que[i].empty()){ Point tmp=que[i].top(); que[i].pop(); int u=tmp.n; int nowd=tmp.dis; if(nowd>dis[i][u])continue; // printf("*%d %d\n",u,nowd); for(int j=0;j<link[u].size();j++){ int v=link[u][j].n; int d=link[u][j].dis; if(dis[i][v]>nowd+d){ dis[i][v]=nowd+d; que[i].push(Point(v,dis[i][v])); } if(i<k && dis[i+1][v]>nowd){ dis[i+1][v]=nowd; que[i+1].push(Point(v,dis[i+1][v])); } // for(int w=0;w<=k;w++){ // for(int r=1;r<=n;r++){ // printf("%d ",dis[w][r]); // } // printf("\n"); // } // printf("\n"); } } } // for(int w=0;w<=k;w++){ // for(int r=1;r<=n;r++){ // printf("%d ",dis[w][r]); // } // printf("\n"); // } int minn=INF; for(int i=0;i<=k;i++) { A = min (a, dis [s] [t]); } Printf ( " % d \ n " , a); }