dij+堆优化
2024-09-08 00:01:37
写这个dij+堆优化的原因是有些地方卡SPFA,只能搞这个;
香甜的奶油:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
#define LL long long
const int maxn=;
const int inf=;
int d[maxn],vis[maxn],n,m,p,b[maxn];
struct node{
int y,next,v;
}e[];
int linkk[maxn],len=;
void insert(int x,int y,int v){
e[++len].y=y;
e[len].next=linkk[x];
linkk[x]=len;
e[len].v=v;
}
typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii> > q;
int dij(int s){
while(!q.empty())q.pop();
q.push(make_pair(,s));
memset(d,,sizeof(vis));d[s]=;
memset(vis,,sizeof(vis));
while(!q.empty()){
int v=q.top().first;
int x=q.top().second;
q.pop();
vis[x]=;
for(int i=linkk[x];i;i=e[i].next){
if(vis[e[i].y])continue;
if(d[e[i].y]>v+e[i].v){
d[e[i].y]=v+e[i].v;
q.push(make_pair(d[e[i].y],e[i].y));
}
}
}
int ans=;
for(int i=;i<=n;i++)ans+=d[b[i]];
return ans;
}
void init(){
scanf("%d%d%d",&n,&p,&m);//cow,muchang,daolu
for(int i=;i<=n;i++)scanf("%d",&b[i]);
int x,y,v;
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&v);
insert(x,y,v);insert(y,x,v);
}
}
void work(){
int minn=inf;
for(int i=;i<=p;i++)minn=min(minn,dij(i));
cout<<minn<<endl;
}
int main(){
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
init();
work();
}
最后的结果是这种情况下的dij跑得比spfa慢不少;
当然可能是我用了stl,常数太大;
spfa和堆优化dij的唯一区别是一个用队列,需要多次迭代找出最优(也可能直接就找到最优值),一个用堆,可以直接找到一个不确定的点的最优值,但由于用了堆,复杂度要乘一个log;
其他的基本一样的;
spfa稀疏图好用,dij稠密图好用,上面的那道题就是个例子;
最新文章
- html5移动web开发笔记(一)Web 存储
- Redis 64 steps
- Android 仿土巴兔选择效果
- linux 命令集
- seeting菜单界面形成--优化
- CloudStack全局参数
- 【POJ】【1704】Georgia and Bob
- java中path和classpath
- WF学习笔记(四)
- poj2393
- WPF从我炫系列4---装饰控件的用法
- spring,hibernate配置事务 beans.xml
- BFS学习 Codeforces 301_div.2_Ice Cave
- (转载) ASP.NET(C#) Web Api 通过文件流下载文件到本地实例
- .Karma+Jasmine+karma-coverage
- less用法小结
- PHP删除数组中空值的方法介绍
- ssm又乱码
- python实现线性规划
- 在使用 #import <;objc/message.h>;时 xcode 报 :Too many arguments to function call, expected 0 , have * 解决方法
热门文章
- [原创][FPGA]Quartus中调用Modelsim波形仿真步骤说明
- luogu P1018 乘积最大
- DELPHI10.2的LINUX数据库开发环境配置
- scrapy 启动失败,scrapy startproject test 出错 &#39;module&#39; object has no attribute &#39;OP_NO_TLSv1_1
- Hibernate操作Blob数据
- CD_Lulu软件著作权中软件分类号
- 关于在 C#中无法静态库引用的解决方法
- Effective Go(官方文档)笔记
- Name和:Name
- CentOSyum操作