独立写查错不能,就是维护一个次短路的dist

题意:给定一个有向图,问从起点到终点,最短路+比最短路距离长1的路的个数。

Sample Input
2
5 8
1 2 3
1 3 2
1 4 5
2 3 1
2 5 3
3 4 2
3 5 4
4 5 3
1 5
5 6
2 3 1
3 2 1
3 1 10
4 5 2
5 2 7
5 2 7
4 1

Sample Output
3
2

2015-05-14

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
#define MOD 1000000007
const int INF=0x3f3f3f3f;
const double eps=1e-;
typedef long long ll;
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
const int MAXN=;
int n,m;
#define typec int
int tot,src,des;
int head[MAXN],cnt[MAXN][],dist[MAXN][],vis[MAXN][];//dis[i][0]为最短路,dis[i][1]为次短路
struct Edge
{
int to,next,w;
}edge[MAXN*];
void addedge(int u,int v,int w)
{
edge[tot].to=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
}
void init()
{
memset(head,-,sizeof(head));
tot=;
}
int dij()
{
int flag;
memset(dist,0x3f,sizeof(dist));
cl(vis);
cl(cnt);
dist[src][]=;
cnt[src][]=;
for(int j=;j<*n;j++)
{
int u;
int Min=INF;
for(int i=;i<=n;i++)
if(!vis[i][]&&dist[i][]<Min) //找到比最短路还短的路
{
u=i;
flag=;
Min=dist[i][];
}
else if(!vis[i][]&&dist[i][]<Min) //说明比最短路长,比次短路短
{
u=i;
flag=;
Min=dist[i][];
}
if(u==-)break;
vis[u][flag]=true;
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
int w=edge[i].w+Min;
if(dist[v][]>w) //如果找到的新的值比最短路小,则更新最短路和次短路的值
{
dist[v][]=dist[v][];//更新次短路
dist[v][]=w;// 更新最短路
cnt[v][]=cnt[v][];
cnt[v][]=cnt[u][flag];//更新最短路和次短路的个数 }
else if(dist[v][]==w) //如果值等于最短路
cnt[v][]+=cnt[u][flag];//更新最短路的个数
else if(dist[v][]>w) //如果找到的值小于次短路的值,更新次短路
{
dist[v][]=w; //更新次短路的值
cnt[v][]=cnt[u][flag]; //更新次短路的个数
}
else if(dist[v][]==w) //如果找到的值等于次短路的值
cnt[v][]+=cnt[u][flag];//更新次短路的个数
}
}
if(dist[des][]+==dist[des][])//如果次短路的值等于最短路值+1
cnt[des][]+=cnt[des][];
return cnt[des][];
}
int main()
{
int tt,u,v,w;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
scanf("%d",&tt);
while(tt--)
{
init();
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
scanf("%d%d",&src,&des);
int ans=dij();
printf("%d\n",ans);
}
return ;
}

2015-1-30:

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#define VM 1005
#define EM 10010
using namespace std;
const int inf=0x3f3f3f3f;
int head[VM],cnt[VM][],dist[VM][],vis[VM][];//dis[i][0]为最短路,dis[i][1]为次短路
int e,src,des,n,m;
struct E
{
int to,w,next;
} edge[EM];
void add(int cu,int cv,int cw)
{
edge[e].to=cv;
edge[e].w=cw;
edge[e].next=head[cu];
head[cu]=e ++;
}
int dij()
{
int i,j,u,min,flag;
memset(dist,0x3f,sizeof(dist));
memset(vis,,sizeof(vis));
memset(cnt,,sizeof(cnt));
dist[src][]=;
cnt[src][]=;
for(i=;i<*n;i++)
{
min=inf;
for(j=;j<=n;j++) //找新的最短路和次短路
if(!vis[j][]&&dist[j][]<min)
{
u=j;
flag=;
min=dist[j][];
}
else if(!vis[j][]&&dist[j][]<min)
{
u=j;
flag=;
min=dist[j][];
}
if(min==inf)
break;
vis[u][flag]=;
for(j=head[u];j!=-;j=edge[j].next)
{
int v=edge[j].to;
int w=edge[j].w+min;
if(dist[v][]>w) //如果找到的新的值比最短路小,则更新最短路和次短路的值
{
dist[v][]=dist[v][];//更新次短路
dist[v][]=w;// 更新最短路
cnt[v][]=cnt[v][];
cnt[v][]=cnt[u][flag];//更新最短路和次短路的个数 }
else if(dist[v][]==w) //如果值等于最短路
cnt[v][]+=cnt[u][flag];//更新最短路的个数
else if(dist[v][]>w) //如果找到的值小于次短路的值,更新次短路
{
dist[v][]=w; //更新次短路的值
cnt[v][]=cnt[u][flag]; //更新次短路的个数
}
else if(dist[v][]==w) //如果找到的值等于次短路的值
cnt[v][]+=cnt[u][flag];//更新次短路的个数
} }
if(dist[des][]+==dist[des][])//如果次短路的值等于最短路值+1
cnt[des][]+=cnt[des][];
return cnt[des][];
}
int main()
{
int T,u,v,w;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(head,0xff,sizeof(head));
e=;
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
scanf("%d%d",&src,&des);
int ans=dij();
printf("%d\n",ans);
}
return ;
}

poj 3463 最短路+次短路的更多相关文章

  1. POJ 3463 有向图求次短路的长度及其方法数

    题目大意: 希望求出走出最短路的方法总数,如果次短路只比最短路小1,那也是可取的 输出总的方法数 这里n个点,每个点有最短和次短两种长度 这里采取的是dijkstra的思想,相当于我们可以不断找到更新 ...

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

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

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

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

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

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

  5. POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...

  6. POJ 3255 Roadblocks (次短路模板)

    Roadblocks http://poj.org/problem?id=3255 Time Limit: 2000MS   Memory Limit: 65536K       Descriptio ...

  7. 算法笔记--次小生成树 && 次短路 && k 短路

    1.次小生成树 非严格次小生成树:边权和小于等于最小生成树的边权和 严格次小生成树:    边权和小于最小生成树的边权和 算法:先建好最小生成树,然后对于每条不在最小生成树上的边(u,v,w)如果我们 ...

  8. POJ 3463 Sightseeing

    最短路+次短路(Dijkstra+priority_queue) 题意是要求你找出最短路的条数+与最短路仅仅差1的次短路的条数. 開始仅仅会算最短路的条数,和次短路的长度.真是给次短路条数跪了.ORZ ...

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

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

  10. poj 3463/hdu 1688 求次短路和最短路个数

    http://poj.org/problem?id=3463 http://acm.hdu.edu.cn/showproblem.php?pid=1688 求出最短路的条数比最短路大1的次短路的条数和 ...

随机推荐

  1. mysql 增加字段脚本,以及删除主键约束的脚本,存储过程

    //增加一个库下面所有表的row_id和其他9个字段的存过 DELIMITER $$ USE `erptest`$$ DROP PROCEDURE IF EXISTS `UPTABLE`$$ CREA ...

  2. java创建并配置多module的maven项目

    1 使用idea创建(推荐) 这篇博客写的特别好,很详细: https://blog.csdn.net/sinat_30160727/article/details/78109769 2 使用ecli ...

  3. mysql处理旧数据-使用模板以及临时表,不建议直接使用本表!!

    一 业务背景新版本中新建了一个项目的角色表,即每个项目都拥有几个角色,原来历史项目是没有角色的,这就要求使用脚本对表中的历史项目进行处理, 业务需求:每个项目都要有三个角色: 表 : pm_proje ...

  4. 【技巧总结】Penetration Test Engineer[4]-Web-Security(文件处理、会话管理、访问控制、SSRF、反序列化漏洞)

    Web安全基础2 3.8.文件处理 1)文件上传 一个正常的业务需求,问题在于控制上传合法文件. 防御文件上传 客户端javascript校验(通常校验扩展名) 检查MIME类型 检查内容是否合法 随 ...

  5. C++ 之Boost 实用工具类及简单使用

    本文将介绍几个 Boost 实用工具类,包括 tuple.static_assert.pool.random 和 program_options等等.需要对标准 STL 具备一定的了解才能充分理解本文 ...

  6. iptables NAT规则【转】

    nat表需要的三个链: 1.PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT; ...

  7. 使用pandas把mysql的数据导入MongoDB。

    使用pandas把mysql的数据导入MongoDB. 首先说下我的需求,我需要把mysql的70万条数据导入到mongodb并去重, 同时在第二列加入一个url字段,字段的值和第三列的值一样,代码如 ...

  8. 004_MAC实用的小工具

    一.XtraFinder(右键菜单扩展) http://www.xuebuyuan.com/173454.html http://www.mamicode.com/info-detail-111618 ...

  9. ORA-12514: TNS:listener does not currently know of service …

    问题描述: 今天数据库查询时遇到问题,具体情形如下截图所示: 问题分析: 看错误明显是TNS监听有问题,要么配置错了,要么数据库没起来.但是当前数据库起来了,也能正常连接使用,因此 考虑被查询对象可能 ...

  10. 洛谷P2194HXY烧情侣

    传送门啦 这个题可以说是tarjan强连通分量的裸题,但需要维护每个强连通分量的最小值,所以做法就很明确了. 我们先明确几个数组的意思: 1.首先是tarjan缩点中的几个数组: dfn[i]:i点的 ...