bzoj 2763: [JLOI2011]飞行路线
233333(别省总是这么良心。。。)
把SPFA的dis[]换成dis[][]搞就行了。。。
1 #include<bits/stdc++.h> 2 #define N 200005 3 #define LL long long 4 #define inf 0x3f3f3f3f 5 #define ls c[x][0] 6 #define rs c[x][1] 7 using namespace std; 8 inline int ra() 9 { 10 int x=0,f=1; char ch=getchar(); 11 while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();} 12 while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} 13 return x*f; 14 } 15 struct node{ 16 int next,to,v; 17 }e[N<<1]; 18 int head[N],cnt,n,k,m,S,T; 19 int dis[10005][12],q[(N<<2)+5]; 20 bool inq[N]; 21 void insert(int x, int y, int v) 22 { 23 e[++cnt].to=y; e[cnt].next=head[x]; e[cnt].v=v; 24 head[x]=cnt; 25 } 26 void SPFA() 27 { 28 for (int i=0; i<=n; i++) for (int j=0; j<=k; j++) dis[i][j]=inf; 29 for (int j=0; j<=k; j++) dis[S][j]=0; 30 int l=0,r=1; q[0]=S; inq[S]=1; 31 while (l<r) 32 { 33 int x=q[l++]; if (l==N<<2) l=0; 34 for (int i=head[x];i;i=e[i].next) 35 { 36 if (dis[e[i].to][0]>dis[x][0]+e[i].v) 37 { 38 dis[e[i].to][0]=dis[x][0]+e[i].v; 39 if (!inq[e[i].to]) 40 { 41 inq[e[i].to]=1; 42 q[r++]=e[i].to; 43 if (r==N<<2) r=0; 44 } 45 } 46 for (int j=1; j<=k; j++) 47 { 48 if (dis[e[i].to][j]>dis[x][j]+e[i].v) 49 { 50 dis[e[i].to][j]=dis[x][j]+e[i].v; 51 if (!inq[e[i].to]) 52 { 53 inq[e[i].to]=1; 54 q[r++]=e[i].to; 55 if (r==N<<2) r=0; 56 } 57 } 58 if (dis[e[i].to][j]>dis[x][j-1]) 59 { 60 dis[e[i].to][j]=dis[x][j-1]; 61 if (!inq[e[i].to]) 62 { 63 inq[e[i].to]=1; 64 q[r++]=e[i].to; 65 if (r==N<<2) r=0; 66 } 67 } 68 } 69 } 70 inq[x]=0; 71 } 72 } 73 int main() 74 { 75 n=ra(); m=ra(); k=ra(); S=ra(); T=ra(); 76 for (int i=1; i<=m; i++) 77 { 78 int x=ra(),y=ra(),v=ra(); 79 insert(y,x,v); 80 insert(x,y,v); 81 } 82 SPFA(); 83 int ans=dis[T][0]; 84 for (int i=1; i<=k; i++) 85 ans=min(ans,dis[T][i]); 86 cout<<ans; 87 }