码迷,mamicode.com
首页 > 其他好文 > 详细

行动!行动!(spfa)

时间:2019-02-17 21:57:59      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:min   lan   pop   space   alt   ==   hide   pen   spfa   

MZOJ1389  

一个无向图 从s到t 有k个路可以权值为0 然后求最小值(我也不晓得描述的对不对)
50分做法:对于k=1的数据,起点跑一次SPFA,终点跑一次SPFA,然后枚举每条边a->b,用起点到a的最短路+终点到b的最短路更新ans即可
100分做法:把SPFA的距离数组改成2维的,令d[i][j]代表起点到点i用了j个急救包后的最短路 然后SPFA的松弛改成两种情况:用急救包和不用 最后的答案就是min{d[t][i]}(0<=i<=k)

 

我忘了还可以把队列设成node型的 QAQ 把dis改成二维还有两次松弛是想到了 愣是没反应过来怎么入队

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=10000+5,inf=0x3f3f3f3f;
 4 int n,m,k,s,t,bag[N][15];
 5 inline int rd()
 6 {
 7     int x=0,w=0;char ch=0;
 8     while(!isdigit(ch)) w|=ch==-,ch=getchar();
 9     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
10     return w?-x:x;
11 }
12 
13 int head[N<<1],cnt=0;
14 struct lxyy
15 {
16     int v,nxt,w,us;
17 }e[N*100];
18 void add(int u,int v,int w)
19 {
20     e[++cnt].v=v;
21     e[cnt].w=w;
22     e[cnt].us=0;
23     e[cnt].nxt=head[u];
24     head[u]=cnt;
25 }
26 struct node
27 {
28     int city,bag;
29     node():city(0),bag(0){}//无参初始化
30     node(int a,int b):city(a),bag(b){}//带参初始化
31 };
32 int dis[N][15];
33 void spfa(int S)
34 {
35     memset(dis,inf,sizeof(dis));
36     for(int i=0;i<=k;i++) dis[S][i]=0;
37     deque<node> q;
38     q.push_back(node(S,0));
39     while(!q.empty())
40     {
41         node u=q.front();
42         q.pop_front();
43         for(int i=head[u.city];i;i=e[i].nxt)
44         {
45             int v=e[i].v,w=e[i].w,uss=u.bag;
46             if(dis[v][uss]>dis[u.city][uss]+w)//不用 
47             {
48                 dis[v][uss]=dis[u.city][uss]+w;
49                 node vv;vv.bag=uss,vv.city=v;
50                 if(!q.empty())
51                 {
52                     node f=q.front();
53                     if(dis[v][uss]<=dis[f.city][f.bag]) q.push_front(vv);
54                     else q.push_back(vv);
55                 }
56                 else q.push_back(vv);
57             }
58             if(uss+1<=k&&dis[v][uss+1]>=dis[u.city][uss])//
59             {
60                 dis[v][uss+1]=dis[u.city][uss];
61                 node vv;vv.city=v,vv.bag=uss+1;
62                 if(!q.empty())
63                 {
64                     node f=q.front();
65                     if(dis[v][uss+1]<=dis[f.city][f.bag]) q.push_front(vv);
66                     else q.push_back(vv);
67                 }
68                 q.push_back(vv);
69              } 
70         }
71     }
72 }
73 
74 int main()
75 {
76     n=rd(),m=rd(),k=rd();
77     s=rd(),t=rd();
78     for(int i=1;i<=m;i++)
79     {
80         int u=rd(),v=rd(),w=rd();
81         add(u,v,w);add(v,u,w);
82     }
83     spfa(s);
84     int ans=inf;
85     for(int i=0;i<=k;i++)
86     ans=min(ans,dis[t][i]);
87     printf("%d",ans);
88     return 0;
89 }
100昏 spfa

 技术图片

行动!行动!(spfa)

标签:min   lan   pop   space   alt   ==   hide   pen   spfa   

原文地址:https://www.cnblogs.com/lxyyyy/p/10392760.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!