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 }

 

posted @ 2017-03-01 07:52  ws_ccd  阅读(124)  评论(0编辑  收藏  举报