[usaco2009febgold]道路翻新 最短路+dp

本文分享了一次使用堆优化Dijkstra算法解决特定路径寻找问题的经历。针对SPFA算法在某些大数据集上出现的性能瓶颈,作者通过实现堆优化Dijkstra算法成功克服了这一挑战,并分享了具体代码实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题居然卡SPFA,难受,写了这么长时间的SPFA,都快把dij忘光了;

设d[i][j]为修j条路到i的最短距离,然后跑堆优化dij就行了;

实测中SPFA两组大数据超时严重;

dij约300ms一组大数据;

但是总感觉这个堆优化dij和SPFA好相像啊,奇怪;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<cstdlib>
 6 #include<ctime>
 7 #include<vector>
 8 #include<algorithm>
 9 #include<queue>
10 using namespace std;
11 #define LL long long
12 const int maxn=10010;
13 const int inf=1000000000;
14 struct node{
15     int x,y,next;
16     int v;
17 }e[maxn*10];
18 int linkk[maxn],len=0;
19 int n,m,k;
20 LL d[maxn][25];
21 void insert(int x,int y,int v){
22     e[++len].y=y;
23     e[len].x=x;
24     e[len].next=linkk[x];
25     linkk[x]=len;
26     e[len].v=v;
27 }
28 void init(){
29     scanf("%d%d%d",&n,&m,&k);
30     int x,y,v;
31     for(int i=1;i<=m;i++){
32         scanf("%d%d%d",&x,&y,&v);
33         insert(x,y,v);insert(y,x,v);
34     }
35 }
36 struct bian{
37     int x,k;
38     LL w;
39     bian(int a,int b,LL c){x=a,k=b,w=c;}
40     bool operator>(const bian& b)const{
41         return w>b.w;
42     } 
43 };
44 priority_queue<bian,vector<bian>,greater<bian> > q;
45 void dij(){
46     memset(d,10,sizeof(d));
47     for(int i=0;i<=k;i++)d[1][i]=0;
48     q.push(bian(1,0,0));
49     while(!q.empty()){
50         bian tmp=q.top();
51         q.pop();
52         int x=tmp.x;
53         int p=tmp.k;
54         LL w=tmp.w;
55         for(int i=linkk[x];i;i=e[i].next){
56             if(p<k&&w<d[e[i].y][p+1]){
57                 d[e[i].y][p+1]=w;
58                 q.push(bian(e[i].y,p+1,w));
59             }
60             if(w+e[i].v<d[e[i].y][p]){
61                 d[e[i].y][p]=w+e[i].v;
62                 q.push(bian(e[i].y,p,d[e[i].y][p]));
63             }
64         }
65     }
66 }
67 void work(){
68     dij();
69     cout<<d[n][k]<<endl;
70 }
71 int main(){
72     init();
73     work();
74 }
View Code

 

转载于:https://www.cnblogs.com/chadinblog/p/5862335.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值