bzoj 2763

好几天没怎么发了。。。最近去看了下初赛题。。。

水题,最短路还有免费(我怎么没有!!),分几次免费乱搞一下就可以。。不过路径权值居然还有0,就WA了一下。。。写spfa的习惯得改改。。。

 1 #include<bits/stdc++.h>
 2 #define inc(i,l,r) for(i=l;i<=r;i++)
 3 #define dec(i,l,r) for(i=l;i>=r;i--)
 4 #define inf 1e9
 5 #define ll long long
 6 #define mem(a,b) memset(a,b,sizeof(a))
 7 #define NM 10000+5
 8 #define nm 50000+5
 9 using namespace std;
10 struct edge{
11     int v,t;
12     edge *next;
13 }e[2*nm],*h[NM];
14 queue<int >q;
15 int o,n,m,i,k,p,x,y,d[11][NM],t,s;
16 bool v[NM];
17 int read(){
18     int x=0,f=1;char ch=getchar();
19     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
20     while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
21     return x*f;
22 }
23 void add(int x,int y,int v){
24     e[++s].t=y;e[s].v=v;e[s].next=h[x];h[x]=&e[s];
25 }
26 int spfa(int x,int y){
27     int s=inf;
28     mem(d,-1);
29     inc(k,0,p){
30     mem(v,0);
31     q.push(x);v[x]++;d[k][x]=0;
32     while(!q.empty()){
33         int t=q.front();q.pop();v[t]=false;
34         for(edge *j=h[t];j;j=j->next){
35         if(d[k][j->t]==-1||d[k][j->t]>d[k][t]+j->v){
36             d[k][j->t]=d[k][t]+j->v;
37             if(!v[j->t]){
38                 v[j->t]++;q.push(j->t);
39             }
40         }
41         if(k>0)
42         if(d[k][j->t]==-1||d[k][j->t]>d[k-1][t]){
43             d[k][j->t]=d[k-1][t];
44             if(!v[j->t]){
45                 v[j->t]++;q.push(j->t);
46             }
47         }
48         }
49     }
50     if(d[k][y]>=0)s=min(d[k][y],s);
51     }
52     return s;
53 }
54 int main(){
55     n=read();m=read();p=read();o=read();t=read();
56     inc(i,1,m){
57         x=read();y=read();k=read();
58         add(x,y,k);add(y,x,k);
59     }
60     printf("%d",spfa(o,t));
61     return 0;
62 }
View Code
原文地址:https://www.cnblogs.com/onlyRP/p/4740968.html