博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-3463-Sightseeing
阅读量:4605 次
发布时间:2019-06-09

本文共 1516 字,大约阅读时间需要 5 分钟。

题意:找出最短路和比最短路大一个单位的路的条数

分析:使用K短路算法会超内存,因此看完题解,要使dij变形解决问题

记录最短路和次短路,和最短路的条数和次短路的条数。

dij松弛的条件改变下,有四种情况

1.比最短路短2.等于最短路3.长与最短路但短于次短路4.等于次短路

View Code
#include 
#include
#include
#include
using namespace std;#define MAXN 1005#define MAXM 10050#define INF 1000000000struct eee{ int v,w,next; eee(){}; eee(int v,int w):v(v),w(w){};}edge[MAXM];struct node{ int v,c; int kind;//0最短路,1次短路 node(){}; node(int v,int c,int kind):v(v),c(c),kind(kind){}; bool operator <(const node a)const{ return c>a.c; }};int m_d[MAXN],s_d[MAXN],m_ans[MAXN],s_ans[MAXN];int first[MAXN];bool vis[MAXN][2];int n,m,e,st,en;priority_queue
q;void init(int n){ memset(first,-1,sizeof(first)); for(int i=0;i<=n;i++){ m_d[i]=s_d[i]=INF; m_ans[i]=s_ans[i]=0; vis[i][0]=vis[i][1]=0; } e=0;}void add(int u,int v,int w){ edge[e]=eee(v,w); edge[e].next=first[u]; first[u]=e++;}void dij(int st){ while(!q.empty())q.pop(); m_d[st]=0; m_ans[st]=1; node a=node(st,0,0); q.push(a); while(!q.empty()){ node cur=q.top(); q.pop(); if(vis[cur.v][cur.kind])continue; vis[cur.v][cur.kind]=1; int u=cur.v; for(int i=first[u];i!=-1;i=edge[i].next){ int temp_len=cur.c+edge[i].w; int v=edge[i].v; if(temp_len

转载于:https://www.cnblogs.com/arbitrary/archive/2012/09/14/2684551.html

你可能感兴趣的文章
-Dmaven.multiModuleProjectDirectory system propery is not set.
查看>>
Python2 unichr() 函数
查看>>
Python 字典 copy()方法
查看>>
Minimum Path Sum
查看>>
Remove Duplicates from Sorted Array II
查看>>
常量指针和指针常量巧妙记忆方法[转]
查看>>
python-haproxy作业讲解视频总结
查看>>
批处理文件脚本总结
查看>>
快速排序C++代码
查看>>
mui搜索框 搜索点击事件
查看>>
bzoj 5289: [Hnoi2018]排列
查看>>
joomla处境堪忧
查看>>
Jquery-AJAX
查看>>
A == B ?
查看>>
洛谷P3763 [Tjoi2017]DNA 【后缀数组】
查看>>
UVa 442 Matrix Chain Multiplication(矩阵链,模拟栈)
查看>>
多种方法求解八数码问题
查看>>
spring mvc ModelAndView向前台传值
查看>>
(黑客游戏)HackTheGame1.21 过关攻略
查看>>
Transparency Tutorial with C# - Part 2
查看>>