poj3463&&hdu1688 次短路(dijkstra)
A*算法超内存。
对于最短路,我们可以维护dis[]数组,来求得最短路,但是此题有次短路,所以定义dis[][2],dis[][0]表示最短路,dis[][1]表示次短路;cnt[][2],cnt[][0]表示最短路条数,cnt[][1]表示次短路条数。
更新时:
如果小于最短路,更新dis[][0]。
如果等于最短路,更新cnt[][0]。
如果大于最短路小于次短路,更新dis[][1];
如果等于次短路,更新cnt[][1]。
由于此时要求2条路,若以外层循环需要2*n-1次。
以下为dijkstra:
#include<stdio.h>
#include<string.h>
#define INF 1000000001
const int maxn = ;
const int maxm = ;
struct node
{
int to;
int v;
int next;
}edge[maxn*maxn/];
int pre[maxn],index,dis[maxn][],cnt[maxn][],n,vis[maxn][];
void init()
{
index=;
memset(pre,-,sizeof(pre));
}
void add(int x,int y,int z)
{
edge[index].to=y;
edge[index].v=z;
edge[index].next=pre[x];
pre[x]=index++;
}
void dij(int s,int t)
{
int i,j,k,pos;
for(i=;i<=n;i++)
{
dis[i][]=INF;
dis[i][]=INF;
cnt[i][]=cnt[i][]=;
vis[i][]=vis[i][]=;
}
dis[s][]=;
cnt[s][]=;
pos=s;
k=;
for(i=;i<*n;i++)
{
int min=INF;
for(j=;j<=n;j++)
{
if(!vis[j][]&&min>dis[j][])
{
min=dis[j][];
k=;
pos=j;
}
else if(!vis[j][]&&min>dis[j][])
{
min=dis[j][];
k=;
pos=j;
}
}
if(min>=INF)
break;
vis[pos][k]=;
for(j=pre[pos];j!=-;j=edge[j].next)
{
int v=edge[j].to;
if(dis[v][]>min+edge[j].v)
{
dis[v][]=dis[v][];//
cnt[v][]=cnt[v][];
dis[v][]=min+edge[j].v;
cnt[v][]=cnt[pos][k];
}
else if(dis[v][]==min+edge[j].v)
{
cnt[v][]+=cnt[pos][k];
}
else if(dis[v][]>min+edge[j].v)
{
dis[v][]=min+edge[j].v;
cnt[v][]=cnt[pos][k];
}
else if(dis[v][]==min+edge[j].v)
{
cnt[v][]+=cnt[pos][k];
}
}
}
int ans=cnt[t][];
if(dis[t][]==dis[t][]+)
ans+=cnt[t][];
printf("%d\n",ans);
}
int main()
{
int i,j,ft,m;
scanf("%d",&ft);
while(ft--)
{
init();
scanf("%d%d",&n,&m);
for(i=;i<m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
int s,t;
scanf("%d%d",&s,&t);
dij(s,t);
}
}
以下为A*算法(超内存):
#include<stdio.h>
#include<string.h>
#include<queue>
#define INF 100000001
using namespace std;
const int maxn = ;
struct node
{
int to;
int g,f;
friend bool operator<(node a,node b){
if(a.f!=b.f)
return a.f>b.f;
return a.g>b.g;
}
};
struct Enode
{
int to;
int v;
int next;
}edge[],fedge[];
int pre[maxn],index,vis[maxn],n,findex,fpre[maxn],dis[maxn];
void init()
{
findex=index=;
memset(fpre,-,sizeof(fpre));
memset(pre,-,sizeof(pre));
}
void add(int x,int y,int z)
{
edge[index].to=y;
edge[index].v=z;
edge[index].next=pre[x];
pre[x]=index++;
}
void fadd(int x,int y,int z)
{
fedge[findex].to=y;
fedge[findex].v=z;
fedge[findex].next=fpre[x];
fpre[x]=findex++;
}
void spfa(int s)
{
int i,j;
queue<int>q;
for(i=;i<=n;i++)
{
vis[i]=;
dis[i]=INF;
}
dis[s]=;
vis[s]=;
q.push(s);
while(!q.empty())
{
int t=q.front();
q.pop();
vis[t]--;
for(i=fpre[t];i!=-;i=fedge[i].next)
{
int v=fedge[i].to;
if(dis[v]>dis[t]+fedge[i].v)
{
dis[v]=dis[t]+fedge[i].v;
q.push(v);
}
}
}
}
void A_star(int s,int t)
{
int i,j,cnt=,first=-;
priority_queue<node>q;
node temp;
temp.f=dis[s];
temp.g=;
temp.to=s;
q.push(temp);
while(!q.empty())
{
temp=q.top();
q.pop();
if(temp.to==t)
{
if(cnt==)
{
first=temp.g;
}
else if(temp.g-first>)
{
break;
}
cnt++;
}
for(i=pre[temp.to];i!=-;i=edge[i].next)
{
node tt;
tt.to=edge[i].to;
tt.g=temp.g+edge[i].v;
tt.f=tt.g+dis[tt.to];
q.push(tt);
}
}
printf("%d\n",cnt);
}
int main()
{
int i,j,ft,m;
scanf("%d",&ft); while(ft--)
{
init();
scanf("%d%d",&n,&m);
for(i=;i<m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
fadd(y,x,z);
}
int s,t;
scanf("%d%d",&s,&t);
spfa(t);
A_star(s,t);
}
}
poj3463&&hdu1688 次短路(dijkstra)的更多相关文章
- hdu 2544 最短路 Dijkstra
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间, ...
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...
- 单源最短路dijkstra算法&&优化史
一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...
- HUD.2544 最短路 (Dijkstra)
HUD.2544 最短路 (Dijkstra) 题意分析 1表示起点,n表示起点(或者颠倒过来也可以) 建立无向图 从n或者1跑dij即可. 代码总览 #include <bits/stdc++ ...
- 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树)
layout: post title: 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树) author: "luowentaoaa" ca ...
- 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)
layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...
- 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)
layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...
- 最短路Dijkstra算法的一些扩展问题
最短路Dijkstra算法的一些扩展问题 很早以前写过关于A*求k短路的文章,那时候还不明白为什么还可以把所有点重复的放入堆中,只知道那样求出来的就是对的.知其然不知其所以然是件容易引发伤痛的 ...
- 华夏60 战斗机(最短路dijkstra)
华夏60 战斗机(最短路dijkstra) 华夏60 超音速战斗机是当今世界上机动性能最先进的战斗机.战斗过程中的一个关键问题是如何在最短的时间内使飞机从当前的飞行高度和速度爬升/俯冲到指定的高度并达 ...
随机推荐
- php用正则表达式匹配URL的简单方法(亲测可行)
https://www.jb51.net/article/43093.htm 在PHP的官网上看到的parse_url()函数的替代方案.结果和parse_url()函数差不多,是使用正则实现的.UR ...
- 机器学习实战之Apriori
机器学习实战之Apriori 1. 关联分析 1.1 定义 关联分析是一种在大规模数据上寻找物品间隐含关系的一种任务.这种关系有2种形式:频繁项集和关联规则. (1) 频繁项集(freq ...
- 多对多关联懒加载导致failed to lazily initialize a collection of role: 实体类, could not initialize proxy - no Session 追加配置fetch = FetchType.EAGER解决
一篇文章需要关联很多个标签,所以他们呈一对多(多对多)的关系 org.springframework.web.util.NestedServletException: Request processi ...
- SpringData初探
前言 项目中用到这个,没有学过,手动搭建,测试执行流程, 理论的东西有时间再补充 Maven依赖 <?xml version="1.0" encoding="UTF ...
- 学习Python笔记---变量和简单数据类型
首先声明,这个是个人在自学的一些笔记,因为是小白,刚接触Python,之前也没有过类似的经验,所以很多东西对于其他人来说可能是小白级别的,写出来没有其他的意思就是自己整理然后记录一下,顺便分享出来,而 ...
- 二、Python安装和第一个程序
<1.Python语言介绍1.官方介绍:Python 是一款易于学习且功能强大的编程语言. 它具有高效率的数据结构,能够简单又有效地实现面向对象编程.Python 简洁的语法与动态输入之特性,加 ...
- zeroclipboard复制插件兼容IE8
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 20190716-T1-礼物
呵呵,我暴力WA了 这个题充分考验了大家对数学的理解(麦蒙大多在胡诌) 但是确实如此啊. 看数据范围想状压.(我额嗯嗯想到暴力?) 然后设出一个可爱的$dp$式(主语当然不是我,是出题人大佬) $f_ ...
- Spring的IoC容器(转)BeanFactory
Spring的IoC容器 Spring读书笔记-----Spring的Bean之Bean的基本概念 加菲猫 Just have a little faith. Spring的IoC容器 (用户持久化类 ...
- IO流7 --- FileWriter写出数据的操作 --- 技术搬运工(尚硅谷)
FileWriter字符输出 @Test public void test3(){ File file = new File("hello1.txt"); FileWriter f ...