好几天没怎么发了。。。最近去看了下初赛题。。。
水题,最短路还有免费(我怎么没有!!),分几次免费乱搞一下就可以。。不过路径权值居然还有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 }