1 solutions

  • 0
    @ 2024-12-10 23:10:28

    C++ :

    /*
    	author :hzoi_ztx
    	title  :传送门 
    	ALG    :双向spfa 
    	comment:
    
    	[2014 10 14 test]
    */
    
    #include <cstdio>
    #include <cstring>
    #include <cctype>
    
    #define  maxn  10005
    #define  maxm  50005
    #define  maxk  21
    #define  info  0x7f7f7f7f
    //#define  size  16419000
    #define  size  1000000
    int ret , ch ;
    
    /*inline int qread() {
    	ret = 0 ; while (!isdigit(ch = getchar())) ;
    	while (ret = ret*10+ch-'0' , isdigit(ch = getchar())) ;
    	return ret ;
    }*/
    
    struct FST{
    	int to , next , len ;
    } e[maxm*2] ; int star[maxn] = {0} , tot_e ;
    
    void addEdge(int u , int v , int w) {
    	tot_e ++ ; e[tot_e].to = v ; e[tot_e].len = w ;
    	e[tot_e].next = star[u] ; star[u] = tot_e ;
    }
    
    int n , m , K ;
    int u , v , w , k , p ;
    int d[maxn][maxk] ;
    bool b[maxn][maxk] = {0} ;
    
    int q1[size] , q2[size] ;
    int head = 0 , rear = -1 ;
    int F(int x) { return ((x%size)+size)%size ; }
     bool empty() { return head == rear+1 ; }
     int front1() { return q1[F(head)] ; }
     int front2() { return q2[F(head)] ; }
     void push_front(int x , int y ) { head -- ; q1[F(head)] = x ; q2[F(head)] = y ; }
     void push_back(int x , int y ) { rear ++ ; q1[F(rear)] = x ; q2[F(rear)] = y ; }
     void pop_front() { head ++ ; }
     void pop_back() { rear -- ; }
     int qsize() { return rear-head+1 ; }
     int front11() { return q1[F(head+1)] ; }
     int front22() { return q2[F(head+1)] ; }
    
    void spfa() {
    	d[1][0] = 0 ;
    	push_back(1 , 0) ;
    	while (!empty()) {
    		u = front1() ; k = front2() ; pop_front() ; b[u][k] = false ;
    		p = star[u] ;
    		while (p) {
    			v = e[p].to ; w = e[p].len ;
    			if (d[u][k]+w < d[v][k]) {
    				d[v][k] = d[u][k]+w ;
    				if (!b[v][k]) {
    					b[v][k] = true ;
    					if (d[v][k] < d[front1()][front2()]
    						|| (qsize()>1 && d[v][k] < d[front11()][front22()])
    					) push_front(v , k) ;
    					else push_back(v , k) ;
    				}
    			}
    			if (k<K &&d[u][k]<d[v][k+1]) {
    				d[v][k+1] = d[u][k] ;
    				if (!b[v][k+1]) {
    					b[v][k+1] = true ;
    					if (d[v][k+1] < d[front1()][front2()]
    						|| (qsize()>1 && d[v][k+1] < d[front11()][front22()])
    					) push_front(v , k+1) ;
    					else push_back(v , k+1) ;
    					
    				}
    			}
    			p = e[p].next ;
    		}
    	}
    }
    
    int main() {
    //	#define READ
    	#ifdef  READ
    		freopen("door.in" ,"r",stdin ) ;
    		freopen("door.out","w",stdout) ;
    	#endif
    	memset(d , 0x7f , sizeof (d)) ;
    //	n = qread() ;
    //	m = qread() ;
    //	K = qread() ;
    scanf("%d%d%d", &n , &m , &K ) ;
    	for (int i = m ; i > 0 ; i -- ) {
    //		u = qread() ;
    //		v = qread() ;
    //		w = qread() ;
    scanf("%d%d%d", &u , &v , &w ) ;
    		addEdge(u , v , w) ;
    		addEdge(v , u , w) ;
    	}
    	
    	spfa() ;
    	w = 0x7f7f7f7f ;
    	for (int i = 0 ; i <= K ; i ++ ) {
    		if (d[n][i] < w) w = d[n][i] ;
    	}
    	printf("%d\n", w ) ;
    	return 0 ;
    }
    
    

    Pascal :

    const maxn=10000; maxe=50000; max=100000000; maxq=4000000;
    type
             node=record
                   u,v:longint;
                   w:longint;
                   next:longint;
             end;
    		 rec=record
    		     data,k:longint;
    			 end;
    var
    graph:array[1..2*maxe] of node;
    h:array[1..maxn] of longint;
    t,i,j,kk,n,m,s,orz,u,v,w:longint;
    mark:array[1..maxn,0..20] of boolean;
    q:array[1..maxq] of rec;
    d:array[1..maxn,0..20] of longint;
    procedure add( u, v, w:longint);
    begin
        inc(t);
        graph[t].u := u;
        graph[t].v := v;
        graph[t].w := w;
        graph[t].next := h[u];
        h[u] := t;
    end;
    procedure spfa;
    var u,p:longint;
        head,tail,i,k:longint;
    begin
      fillchar(mark,sizeof(mark),false);
      for i:=1 to n do
    	for j:=0 to 20 do
    	 d[i,j]:=max;
      for i:=0 to kk do
         d[1,i]:=0;
      head:=0; tail:=1;
      q[tail].data:=1; q[tail].k:=0;
      mark[1,0]:=true;
      while (head<>tail) do {队列不空并且队尾指针没有溢出}
    	  begin
            inc(head); if head=maxq then head:=1;
    		u:=q[head].data; k:=q[head].k;
    		mark[u,k]:=false;
    		p:=h[u];  {p是邻接点的位置下标}
    		while p<>0 do
    			begin
    	           if  d[u,k]+graph[p].w<d[graph[p].v,k] then
    				   begin
    			           d[graph[p].v,k]:=d[u,k]+graph[p].w;
    						if not mark[graph[p].v,k] then
    						   begin
    					         {inc(times[graph[p].v]);
    		                     if times[graph[p].v]>n then begin orz:=1; exit; end;}
    							 inc(tail); if tail=maxq then tail:=1;
    					         q[tail].data:=graph[p].v; q[tail].k:=k;
    							 mark[graph[p].v,k]:=true;
    						   end;
    					end;
    				if (k<kk) and (d[graph[p].v,k+1]>d[u,k]) then
                        begin
                   	        d[graph[p].v,k+1]:=d[u,k];
                            if not mark[graph[p].v,k+1] then
    						   begin
    					         {inc(times[graph[p].v]);
    		                     if times[graph[p].v]>n then begin orz:=1; exit; end;}
    							 inc(tail); if tail=maxq then tail:=1;
    					         q[tail].data:=graph[p].v; q[tail].k:=k+1;
    							 mark[graph[p].v,k+1]:=true;
    						   end;
                        end;
    				p:=graph[p].next;
    			end;
    	 end;
    end;
    begin
     readln(n,m,kk);
     t:=0;
     fillchar(h,sizeof(h),0);
     fillchar(graph,sizeof(graph),0);
     for j:=1 to m do  {读入边,建立邻接表}
       begin
         readln(u,v,w);
         add(u,v,w);
         add(v,u,w);
        end;
       s:=1;
       spfa;
       j:=max;
       for i:=1 to kk do
          if d[n,i]<j then j:=d[n,i];
       writeln(j);
    end.
    
    
    • 1

    Information

    ID
    589
    Time
    10000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By