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)的更多相关文章

  1. hdu 2544 最短路 Dijkstra

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间, ...

  2. 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法

    图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...

  3. 单源最短路dijkstra算法&&优化史

    一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...

  4. HUD.2544 最短路 (Dijkstra)

    HUD.2544 最短路 (Dijkstra) 题意分析 1表示起点,n表示起点(或者颠倒过来也可以) 建立无向图 从n或者1跑dij即可. 代码总览 #include <bits/stdc++ ...

  5. 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树)

    layout: post title: 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树) author: "luowentaoaa" ca ...

  6. 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

    layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...

  7. 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

    layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...

  8. 最短路Dijkstra算法的一些扩展问题

    最短路Dijkstra算法的一些扩展问题     很早以前写过关于A*求k短路的文章,那时候还不明白为什么还可以把所有点重复的放入堆中,只知道那样求出来的就是对的.知其然不知其所以然是件容易引发伤痛的 ...

  9. 华夏60 战斗机(最短路dijkstra)

    华夏60 战斗机(最短路dijkstra) 华夏60 超音速战斗机是当今世界上机动性能最先进的战斗机.战斗过程中的一个关键问题是如何在最短的时间内使飞机从当前的飞行高度和速度爬升/俯冲到指定的高度并达 ...

随机推荐

  1. Django项目:CMDB(服务器硬件资产自动采集系统)--01--01CMDB获取服务器基本信息

    AutoClient #settings.py # ————————01CMDB获取服务器基本信息———————— import os BASEDIR = os.path.dirname(os.pat ...

  2. ACM常用的Java代码

    import java.util.*; import java.io.*; public class Main { public static void main(String[] args) thr ...

  3. JAVA开源微信管家平台——JeeWx捷微V3.3版本发布(支持微信公众号,微信企业号,支付窗)

    JeeWx捷微V3.3版本紧跟微信小程序更新,在原有多触点版本基础上,引入了更多的新亮点:支持微信公众号.微信企业号.支付宝服务窗等多触点开发:采用微服务框架实现,可插拔可集成,轻量级开发:对小程序的 ...

  4. 微服务注册发现集群搭建—单机版(Registrator+Consul+Consul-template+nginx)

    1.创建模板文件 docker-compose.yml #backend web application, scale this with docker-compose scale web=3 web ...

  5. tensorflow/model下的各个参数的理解

    首先,这个对应的proto就是 然后config里面的image_resizer等等 就是proto里面的image_resizer 等等,对应的参数可以在proto里面寻找解释和默认值以及类型 再比 ...

  6. Leetcode441Arranging Coins排列硬币

    你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形成完整阶梯行的总行数. n 是一个非负整数,并且在32位有符号整型的范围内. 示例 ...

  7. TZ_16_Vue_入门案例

    1.新建一个html文件导入vue.js <script src="node_modules/vue/dist/vue.js"></script> 2.创建 ...

  8. idea中HTML格式化时标签缩进问题

    在IntelliJ Idea中HTML格式化时,默认<head><body>以及<body>下的以及标签都不会缩进. 解决方法:editor->code st ...

  9. GIT → 09:TortoiseGit 图形化工具

    GIT → 09:TortoiseGit 图形化工具

  10. IO流5 --- FileReader读入数据的基本操作 --- 技术搬运工(尚硅谷)

    FileReader 字符输入流 @Test public void test1(){ File file = new File("hello.txt"); FileReader ...