poj 3463 最短路+次短路
独立写查错不能,就是维护一个次短路的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 最短路+次短路的更多相关文章
- POJ 3463 有向图求次短路的长度及其方法数
题目大意: 希望求出走出最短路的方法总数,如果次短路只比最短路小1,那也是可取的 输出总的方法数 这里n个点,每个点有最短和次短两种长度 这里采取的是dijkstra的思想,相当于我们可以不断找到更新 ...
- POJ 3463 Sightseeing (次短路经数)
Sightseeing Time Limit: 2000MS Memory Limit: 65536K Total Submissions:10005 Accepted: 3523 Descr ...
- POJ 3463 Sightseeing 【最短路与次短路】
题目 Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the ...
- POJ - 3463 Sightseeing 最短路计数+次短路计数
F - Sightseeing 传送门: POJ - 3463 分析 一句话题意:给你一个有向图,可能有重边,让你求从s到t最短路的条数,如果次短路的长度比最短路的长度多1,那么在加上次短路的条数. ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- POJ 3255 Roadblocks (次短路模板)
Roadblocks http://poj.org/problem?id=3255 Time Limit: 2000MS Memory Limit: 65536K Descriptio ...
- 算法笔记--次小生成树 && 次短路 && k 短路
1.次小生成树 非严格次小生成树:边权和小于等于最小生成树的边权和 严格次小生成树: 边权和小于最小生成树的边权和 算法:先建好最小生成树,然后对于每条不在最小生成树上的边(u,v,w)如果我们 ...
- POJ 3463 Sightseeing
最短路+次短路(Dijkstra+priority_queue) 题意是要求你找出最短路的条数+与最短路仅仅差1的次短路的条数. 開始仅仅会算最短路的条数,和次短路的长度.真是给次短路条数跪了.ORZ ...
- poj 3463 Sightseeing( 最短路与次短路)
http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS Memory Limit: 65536K Total Submissio ...
- poj 3463/hdu 1688 求次短路和最短路个数
http://poj.org/problem?id=3463 http://acm.hdu.edu.cn/showproblem.php?pid=1688 求出最短路的条数比最短路大1的次短路的条数和 ...
随机推荐
- 80.YCrCb - YUV - RGB之间的介绍
一,引言 YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法(属于PAL).YUV主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视.与RGB视频信号传输相比,它最大的优点在于只需 ...
- 读书笔记 effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
假设你正在操作一个Rectangle类.每个矩形可以通过左上角的点和右下角的点来表示.为了保证一个Rectangle对象尽可能小,你可能决定不把定义矩形范围的点存储在Rectangle类中,而是把它放 ...
- Python_oldboy_自动化运维之路(八)
本节内容: 列表生成式,迭代器,生成器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器,生成器 1.列表生成式 #[列表生成] #1.列 ...
- 写在用Mac进行Java开发之前
在用Mac进行开发之前,建议浏览以下几个概念. 1. 几个基础概念 - 计算机 计算机(computer)俗称电脑,发明者是约翰·冯·诺依曼,计算机是现代一种用于高速计算的电子计算机器,可以进行数值计 ...
- Java OOM学习
转载自原文: 什么是java OOM?如何分析及解决oom问题? 什么是OOM? OOM,全称"Out Of Memory",翻译成中文就是"内存用完了",表现 ...
- Java事务管理之JDBC
前言 关于Java中JDBC的一些使用可以参见: Java 中使用JDBC连接数据库例程与注意事项 在使用JDBC的使用, 如何进行事务的管理.直接看一下代码 示例代码 /** * @Title: J ...
- 常用sql 全记录(添加中)
-- 数据库SQL总结中........... --SQL分类: (CREATE,ALTER,DROP,DECLARE) ---DDL—数据定义语言(SELECT,DELETE,UPDATE,INSE ...
- 20155309南皓芯 实验2 Windows口令破解
在网络界,攻击事件发生的频率越来越高,其中相当多的都是由于网站密码泄露的缘故,或是人为因素导致,或是口令遭到破解,所以从某种角度而言,密码的安全问题不仅仅是技术上的问题,更主要的是人的安全意识问题. ...
- win7下scheme环境配置
运行lisp方言--scheme,在windows下,用eclipse. 1.eclipse装好 2.eclipse安装插件scheme48 development took, http://www. ...
- JAVA类课后练习
1.Pg168--2 package com.hanqi; import java.util.Scanner; public class Rectangle { Rectangle() { //完成初 ...