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. sas正则式之prxparen

    sas正则式之prxparen 今天还是要继续正则式的内容,这周的内容是prxparen函数,这个函数我个人觉得特别有用,是因为他和"|"结合使用可以同时容纳很多种情况的字符串. ...

  2. Spring MVC(三)--控制器接受普通请求参数

    Spring MVC中控制器接受参数的类方式有以下几种: 普通参数:只要保证前端参数名称和传入控制器的参数名称一致即可,适合参数较少的情况: pojo类型:如果前端传的是一个pojo对象,只要保证参数 ...

  3. Java基础程序与面向对象

    首先,我们需要了解和知道一些Java的基本概念: 程序编译过程:.java文件会通过编译器--被编译成一个. class字节码文件---再由虚拟机运行.class文件解释运行Java程序. 编码规范: ...

  4. mongodb+nodejs 增删查的demo

    1.启动数据库 启动完成后显示 端口号是27017 2.创建数据库 创建一个名为mydb的数据库   3.先查询一下当然的用户,再新增一个 4.创建数据表,查询所有的表 db.createCollec ...

  5. 2018-12-15-VisualStudio-通过-EditorBrowsable-隐藏不开放的属性或方法

    title author date CreateTime categories VisualStudio 通过 EditorBrowsable 隐藏不开放的属性或方法 lindexi 2018-12- ...

  6. HDFS 冗余数据保存

  7. IntersectionObserver API 使用教程(转载)

    作者: 阮一峰 日期: 2016年11月 3日 网页开发时,常常需要了解某个元素是否进入了"视口"(viewport),即用户能不能看到它. 上图的绿色方块不断滚动,顶部会提示它的 ...

  8. 删除n天前的文件或文件夹 bat批处理

    @echo off @echo deleting... FORFILES /p "D:\a" /D -1 /C "cmd /c echo deleting @file . ...

  9. 【python之路27】vars()包含的全局变量对象

    213 一..py文件里面包含全局变量 print(vars())输出结果如下: {'__name__': '__main__', '__doc__': None, '__package__': No ...

  10. 傳説中的 jsonp

    jsonp的由來 1 . 網頁上的東西衹要跨域了就不能傳送或者接受數據了.不管是什麽衹要是跨域.Ajax直接请求普通文件存在跨域无权限访问的问题, 2 . 但是src這個東西比較厲害了,請求哪裏都可以 ...