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 超音速战斗机是当今世界上机动性能最先进的战斗机.战斗过程中的一个关键问题是如何在最短的时间内使飞机从当前的飞行高度和速度爬升/俯冲到指定的高度并达 ...
随机推荐
- DB-SQLServer:SQLServer
ylbtech--DB-SQLServer:SQLServer SQL是英文Structured Query Language的缩写,意思为结构化查询语言.SQL语言的主要功能就是同各种数据库建立联系 ...
- PAT甲级——A1061 Dating
Sherlock Holmes received a note with some strange strings: Let's date! 3485djDkxh4hhGE 2984akDfkkkkg ...
- 群晖的moments套件 发生未知错误
一次了,哎 也不知道什么原因引起的 只能再搞一遍 先把homes文件夹数据弄走,免得弄丢 然后卸载momemts,删除数据库 还有其他人遇到这个情况http://www.gebi1.com/threa ...
- 【DM8168学习笔记2】DM8168 EZSDK 结构
1 2 3 4 5
- spring-jdbc-aop事务
1 spring整合JDBC 1.1 概述 spring提供了很多模板整合Dao技术 spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术. JDBCTemplate => J ...
- tomcat文件目录结构及功能介绍
tomcat-7.0.50解压版,主目录一览: 我们可以看到主目录下有bin,conf,lib,logs,temp,webapps,work 7个文件夹,下面对他们分别进行介绍: 如下介绍: bin目 ...
- C++stl中vector的几种常用构造方法
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #i ...
- web前端学习(四)JavaScript学习笔记部分(8)-- JavaScript 浏览器对象
1.window对象 1.1.window对象: window对象是BOM的核心,window对象指当前的浏览器窗口 所有javaScript全局对象.函数以及变量均自动生成为window对象的成员 ...
- Java review-basic1
1. Dependency Injection Answer: Any application is composed of many objects that collaborate with ea ...
- mysql 主从复制 配置
mysql 的 默认配置文件在 /etc/my.cnf 1 修改主库 配置文件: 设置 服务id,并且开启二进制日志文件. server-id=1 log-bin=mysql-bin 2重启服务:se ...