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 超音速战斗机是当今世界上机动性能最先进的战斗机.战斗过程中的一个关键问题是如何在最短的时间内使飞机从当前的飞行高度和速度爬升/俯冲到指定的高度并达 ...
随机推荐
- 写js过程中遇到的一个bug
<div class="func_Div" id="xxcx"><span>信息查询</span> ...
- 升级gitk后,Error in startup script: unknown color name "lime"
$ gitkError in startup script: unknown color name "greeen" (processing "-fore" o ...
- Cesium打包命令总结
引言 Cesium实验室QQ群里有人在问Cesium的打包问题.我想干脆总结一下Cesium的打包命令特点,写篇文章,顺带庆祝一下1024程序员节.. Cesium的npm脚本有好多,其中几个和打包相 ...
- Ubuntu添加桌面图标
下面以添加eclipse图标为例: sudo gedit /usr/share/applications/eclipse.desktop 然后在弹出的文件中输入: [Desktop Entry] Na ...
- [code]彩色图像直方图均衡化 histogram_rgb
//2013.9 eageldiao #ifdef HISTOGRAM_RGB unsigned ]; unsigned intncount[]={},ncount1[]={},ncount2[]={ ...
- Python的几个高级编程技巧
Python有一些技巧对你来说是新知识,但是还有一些技巧会让你的代码效率大幅提升. 本文总结了一下自己用到的一些Python高级编程技巧,希望对大家有帮助. 列表生成器 a=[1,2,3] [x*x ...
- Leetcode147. Insertion Sort List对链表进行插入排序
对链表进行插入排序. 从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中. 插入排序算法: 插入排序是 ...
- IntelliJ IDEA 中如何查看一个类的所有继承关系(当前类的所有继承关系图)
IntelliJ IDEA 中如何查看一个类的所有继承关系(当前类的所有继承关系图) .embody{ padding:10px 10px 10px; margin:0 -20px; border-b ...
- 门诊叫号系统系列-1.语音叫号 .net c#
最近收到一个需求,朋友诊室需要做到门诊叫号,流程如下:病人选择医生-刷身份证排队-医生点击病人姓名叫号. 经过团队的努力,一个简易的门诊叫号系统已经完成.现在把各个功能记录下来,方便以后查看. 1.语 ...
- Leetcode91.Decode Ways解码方法
一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 1 ...