最短路+次短路(Dijkstra+priority_queue)

题意是要求你找出最短路的条数+与最短路仅仅差1的次短路的条数。

開始仅仅会算最短路的条数,和次短路的长度。真是给次短路条数跪了。ORZ。其它人都用Dijkstra。我想试试SPFA。

然后大神说要把这个最短,次短都拿去push。并且要用最短来。priority_queue。优先队列。妈蛋,这不是优先队列优化的Dijkstra么。

改得无比忧伤。反正開始改来改去连例子都过不了。

后来想着 假设最短能够更新,原来的最短就变成次短了。

思路来了,刷刷就写完了。

WA……ORZ。

。。

最后对照大神的才知道。我push的仅仅有节点和长度。须要把标记也进去。

OOOOOOOOORZ。

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
#define LL long long
using namespace std;
int n,m;
struct lx
{
int v,len;
};
vector <lx> g[1001]; struct node
{
bool flag;
int u;
LL len;
node(LL llen,int uu,bool fflag):len(llen),u(uu),flag(fflag){} };
bool operator <(node a,node b)
{
return a.len>b.len;
}
void Dijkstra(int start,int thend)
{
bool vis[1001][2];
int cot[1001][2];
LL dis[1001][2];
for(int i=1; i<=n; i++)
{
for(int j=0;j<2;j++)
dis[i][j]=INF,cot[i][j]=0,vis[i][j]=0;;
}
priority_queue<node>q;
q.push(node(0,start,0));
dis[start][0]=0;
cot[start][0]=cot[start][1]=1; while(!q.empty())
{
node now=q.top();q.pop();
int u=now.u;
// printf("%lld %d %d==\n",now.len,now.u,now.flag);
if(vis[u][now.flag])continue;
vis[u][now.flag]=1; for(int j=0;j<g[u].size();j++)
{
LL tmp=g[u][j].len+now.len;
int v=g[u][j].v; if(dis[v][0]>tmp)
{
dis[v][1]=dis[v][0];
cot[v][1]=cot[v][0];
dis[v][0]=tmp;
cot[v][0]=cot[u][now.flag];
q.push(node(tmp,v,0));
q.push(node(dis[v][1],v,1)); }
else if(dis[v][0]==tmp)
cot[v][0]+=cot[u][now.flag];
else if(dis[v][1]>tmp)
{
dis[v][1]=tmp;
cot[v][1]=cot[u][now.flag];
q.push(node(tmp,v,1));
}
else if(dis[v][1]==tmp)
cot[v][1]+=cot[u][now.flag];
}
}
// for(int i=1;i<=n;i++)
// printf("%d :%lld-%lld\n",i,dis[i][0],dis[i][1]); if(dis[thend][0]+1!=dis[thend][1])
printf("%d\n",cot[thend][0]);
else
printf("%d\n",cot[thend][0]+cot[thend][1]);
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
g[i].clear();
int u,v,len;
lx now;
while(m--)
{
scanf("%d%d%d",&u,&v,&len);
now.v=v,now.len=len;
g[u].push_back(now);
}
int start,thend;
scanf("%d%d",&start,&thend);
Dijkstra(start,thend);
}
}

POJ 3463 Sightseeing的更多相关文章

  1. poj 3463 Sightseeing( 最短路与次短路)

    http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  2. POJ - 3463 Sightseeing 最短路计数+次短路计数

    F - Sightseeing 传送门: POJ - 3463 分析 一句话题意:给你一个有向图,可能有重边,让你求从s到t最短路的条数,如果次短路的长度比最短路的长度多1,那么在加上次短路的条数. ...

  3. poj 3463 Sightseeing——次短路计数

    题目:http://poj.org/problem?id=3463 当然要给一个点记最短路和次短路的长度和方案. 但往优先队列里放的结构体和vis竟然也要区分0/1,就像把一个点拆成两个点了一样. 不 ...

  4. POJ 3463 Sightseeing (次短路经数)

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions:10005   Accepted: 3523 Descr ...

  5. POJ 3463 Sightseeing 【最短路与次短路】

    题目 Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the ...

  6. POJ 3463 Sightseeing 题解

    题目 Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the ...

  7. poj 3463 Sightseeing(次短路+条数统计)

    /* 对dij的再一次理解 每个点依旧永久标记 只不过这里多搞一维 0 1 表示最短路还是次短路 然后更新次数相当于原来的两倍 更新的时候搞一下就好了 */ #include<iostream& ...

  8. POJ 3463 Sightseeing (次短路)

    题意:求两点之间最短路的数目加上比最短路长度大1的路径数目 分析:可以转化为求最短路和次短路的问题,如果次短路比最短路大1,那么结果就是最短路数目加上次短路数目,否则就不加. 求解次短路的过程也是基于 ...

  9. POJ 1637 Sightseeing tour(最大流)

    POJ 1637 Sightseeing tour 题目链接 题意:给一些有向边一些无向边,问能否把无向边定向之后确定一个欧拉回路 思路:这题的模型很的巧妙,转一个http://blog.csdn.n ...

随机推荐

  1. 【Pollard-rho算法】【DFS】poj2429 GCD & LCM Inverse

    题意:给你一两个数m和n,它们分别是某对数A,B的gcd和lcm,让你求出一对使得A+B最小的A,B. n/m的所有质因子中,一定有一部分是只在A中的,另一部分是只在B中的. 于是对n/m质因子分解后 ...

  2. Centos 右上角面板里没有wired network图标的问题

    开了很多的网页查看解决这个问题,都不是很有效,最后很简单的改了下一个文件就ok了,自己记录下,以免忘记! 打入命令:sudo gedit /etc/NetworkManager/nm-system-s ...

  3. ACM -- 算法小结(四)KMP(POJ3461)

        KMP -- POJ3461解题报告 问题描述:给出字符串P和字符串T,问字符串P在字符串T中出现的次数 Sample Input 3 BAPC BAPC AZA AZAZAZA VERDI ...

  4. VK Cup 2016 - Round 1 (Div. 2 Edition) C. Bear and Forgotten Tree 3 构造

    C. Bear and Forgotten Tree 3 题目连接: http://www.codeforces.com/contest/658/problem/C Description A tre ...

  5. Unity快捷键总结

    Shift+Alt+A  物体快速激活 Ctrl+P 开始 Ctrl+Shift+P 暂停 Ctrl+B  编译并运行 Z  Pivot/Center切换 X Local/Global切换

  6. 如何终止JQUERY的$.AJAX请求

    最近遇到,如果用户频繁点击ajax请求,有两个问题: 1,如果连续点击了5个ajax请求,前4个其实是无效的,趁早结束节省资源. 2,更严重的问题是:最后一个发送的请求,响应未必是最后一个,有可能造成 ...

  7. HTML5 book响应式翻页效果

    翻页,HTML5源码下载,HTML5响应式翻页效果,鼠标移到右上角会看到翻页效果,需要鼠标拖动后翻页,支持ie9+,html5浏览器. 单页和双页. 自动播放和暂停. 点击左右翻页. 鼠标点击左右页面 ...

  8. springMvc 的参数验证 BindingResult result 的使用

    http://blog.sina.com.cn/s/blog_6829be5c0101alxh.html 非常详细的一篇讲解 并且值得深入探讨 http://bbs.csdn.NET/topics/3 ...

  9. Python break 语句

    Python break 语句 Python break语句,就像在C语言中,打破了最小封闭for或while循环. break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归 ...

  10. 深入理解Apache Flink核心技术

    深入理解Apache Flink核心技术 2016年02月18日 17:04:03 阅读数:1936 标签: Apache-Flink数据流程序员JVM   版权声明:本文为博主原创文章,未经博主允许 ...