Cattle off more school fourth J Free shortest

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); 
}

 

Guess you like

Origin www.cnblogs.com/isakovsky/p/11257352.html