1 solutions
-
0
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