SPOJ 3643 /BNUOJ 21860 Traffic Network
题意:现在已有m条单向路,问在给你的k条双向路中选择一条,使得s到t的距离最短
思路:设双向路两端点为a,b;长度为c。
s到t的有三种情况:
1:原本s到t的路径
2:从s到a,a到b,b再到t的路径
3:从s到b,b到a,a再到t的路径
s到t的最短路径即三者之间的最小值,枚举每个双向路,取其中的最小值即可。
用两次dijkstra,第一次求s到其它点的距离(正向图),第二次求t到其它点的距离(反向图)
因为实际上我们要求的是其它点到t的距离,所以在第二次用dijkstra时,是在原先图的反向图基础上,求t到其它点的距离。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=0x3f3f3f3f; int mark,n,m,k,s,t;
int a,b,c;
int ans;
int disS[],disT[]; //disS[i]表示s到i的最短距离,disT[i]表示i到t的最短距离
int vis[];
int tot1=,tot2=; struct Road{
int next;
int to;
}road1[],road2[];
int rlength[];
int head1[],head2[]; //建立正向图
void add1(int x,int y,int l){
road1[tot1].next=head1[x];
road1[tot1].to=y;
rlength[tot1]=l;
head1[x]=tot1++;
}
//建立反向图
void add2(int x,int y,int l){
road2[tot2].next=head2[x];
road2[tot2].to=y;
rlength[tot2]=l;
head2[x]=tot2++;
} struct dij_node{
int u,dis; void init(int uu,int diss){
u=uu;
dis=diss;
} bool operator < (const dij_node& tmp) const
{
return dis> tmp.dis; //从大到小排
//优先级队列默认是取“最大”的,即排在最后的,如果从小到大排,则会取最大的出来。
//因此得从大到小排,这样才能取最小的出来。
}
}; //s到其它点的距离
void dijkstra1(int v0){
int idx;
dij_node temp,minNode;
priority_queue<dij_node> q;
memset(disS,maxn,sizeof(disS));
memset(vis,,sizeof(vis));
disS[v0]=;
vis[v0]=;
temp.init(v0,disS[v0]);
q.push(temp); while(!q.empty()){
minNode=q.top();
q.pop();
idx=minNode.u;
vis[idx]=;
for(int k=head1[idx];k!=-;k=road1[k].next){
int v=road1[k].to;
if(!vis[v] && disS[idx]+rlength[k]<disS[v]){
disS[v]=disS[idx]+rlength[k];
temp.init(v,disS[v]);
q.push(temp);
}
}
} } //其它点到t的距离
void dijkstra2(int v0){
int idx;
dij_node temp,minNode;
priority_queue<dij_node> q;
memset(disT,maxn,sizeof(disT));
memset(vis,,sizeof(vis));
disT[v0]=;
vis[v0]=;
temp.init(v0,disT[v0]);
q.push(temp);
while(!q.empty()){
minNode=q.top();
q.pop();
idx=minNode.u;
vis[idx]=;
for(int k=head2[idx];k!=-;k=road2[k].next){
int v=road2[k].to;
if(!vis[v] && disT[idx]+rlength[k]<disT[v]){
disT[v]=disT[idx]+rlength[k];
temp.init(v,disT[v]);
q.push(temp);
}
}
} } int main()
{
scanf("%d",&mark); for(int q=;q<=mark;q++){
memset(head1,-,sizeof(head1));
memset(head2,-,sizeof(head2));
//memset(exist,0,sizeof(exist));
tot1=;tot2=; scanf("%d%d",&n,&m);
scanf("%d%d%d",&k,&s,&t); for(int p=;p<=m;p++){
scanf("%d%d%d",&a,&b,&c);
add1(a,b,c);
add2(b,a,c);//反向图,因为要求出其它点到t点的最短路径,但如果用dijkstra求得话是t到其它点的,因此这里建立反向图
} dijkstra1(s);
dijkstra2(t); ans=maxn;
bool flag=false;
for(int p=;p<=k;p++){
scanf("%d%d%d",&a,&b,&c);
if(disS[a]<maxn && disS[b]<maxn && disT[a]<maxn && disT[b]<maxn){
flag=true;
ans=min(disS[a]+c+disT[b],ans);
ans=min(disS[b]+c+disT[a],ans);
ans=min(disS[t],ans);
}
} if(!flag)
printf("-1\n");
else
printf("%d\n",ans);
}
return ;
}
SPOJ 3643 /BNUOJ 21860 Traffic Network的更多相关文章
- Method for finding shortest path to destination in traffic network using Dijkstra algorithm or Floyd-warshall algorithm
A method is presented for finding a shortest path from a starting place to a destination place in a ...
- Traffic Network in Numazu
Traffic Network in Numazu 题目描述 Chika is elected mayor of Numazu. She needs to manage the traffic in ...
- bnuoj 33648 Neurotic Network(树形模拟题)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=33648 [题解]:结果先对MOD*2取模,才能得到结果是否是正确的奇偶问题,得到最后结果之后再对MO ...
- HDU - 6393 Traffic Network in Numazu(树链剖分+基环树)
http://acm.hdu.edu.cn/showproblem.php?pid=6393 题意 给n个点和n条边的图,有两种操作,一种修改边权,另一种查询u到v的最短路. 分析 n个点和n条边,实 ...
- HDU contest808 ACM多校第7场 Problem - 1008: Traffic Network in Numazu
首先嘚瑟一下这场比赛的排名:59 (第一次看到这么多 √ emmmm) 好了进入正文QAQ ...这道题啊,思路很清晰啊. 首先你看到树上路径边权和,然后还带修改,不是显然可以想到 树剖+线段树 维护 ...
- hdu 6393 Traffic Network in Numazu (树链剖分+线段树 基环树)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6393 思路:n个点,n条边,也就是基环树..因为只有一个环,我们可以把这个环断开,建一个新的点n+1与之相 ...
- HDU - 6393 Traffic Network in Numazu (LCA+RMQ+树状数组)
这道题相当于将这两题结合: http://poj.org/problem?id=2763 http://codeforces.com/gym/101808/problem/K 题意:有N各点N条边的带 ...
- HDU - 6393 Traffic Network in Numazu (基环树+树链剖分/LCA)
题意:给定一个带权边无向基环树,有两种操作,一种是改变某个边的权值,另一种是询问两点间的最短路径. 可以对环进行缩点,以环为根建立一棵新树,并记录与环相连的所有点和环上的哪个点相连,将路径分为环外和环 ...
- hdu6393 Traffic Network in Numazu 树链剖分
题目传送门 题意:给出n个点n条边的无向带权图,再给出两种操作,操作1是将第x条边的边权修改为y,操作2是询问点x到点y的最短路径. 思路:如果是n个点n-1条边,题目就变成了树,修改边权和询问最短路 ...
随机推荐
- mongodb 入门笔记
选择Mongo的关键是:这是一个 JSON 文档数据库. 1. Mongo 的术语 文档:一条完整的数据就是一个文档(对应于 MySQL 的一行). 集合:一组文档构成一个集合.类似 MySQL 中表 ...
- php var_export与var_dump 输出的不同
var_export必须返回合法的php代码,var_export返回的代码,可以直接当作php代码赋值个一个变量. 而这个变量就会取得和被var_export一样的类型的值. 问题描述: 在跟踪 ...
- MySQL excel导入错误 Out of range value adjusted for column
修改my.ini,将 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"改为 sql ...
- Android Material Design:ViewPager与android.support.design.widget.TabLayout双向交互联动切换
通常,android.support.design.widget.TabLayout与Android的ViewPager联合使用,实现与ViewPager的切换与联动.(1)比如,当用户手指触摸选择T ...
- 测试驱动开发实践 - Test-Driven Development
一.前言 不知道大家有没听过“测试先行的开发”这一说法,作为一种开发实践,在过去进行开发时,一般是先开发用户界面或者是类,然后再在此基础上编写测试. 但在TDD中,首先是进行测试用例的编写,然后再进行 ...
- EWOULDBLOCK = EAGAIN
#define EAGAIN 11 /* Try again */ #define EINTR 4 /* Interrupted system call */ #define EWOULDBLOCK ...
- ORA-14404
OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...
- mysqlsla 分析mysql慢查询日志
发现有一个工具mysqlsla,分析查询日志比 mysqldumpslow分析的会更清晰明了! 安装mysqlsla: 下载mysqlsla-2.03.tar.gz [root@yoon export ...
- windows32下安装zend framework2
首先安装好php(5.3.3以上).apache和mysql apache 开启mod_rewrite 模块 将所有AllowOverride None设置为AllowOverride FileInf ...
- PDF打印
问题: Microsoft Excel 不能访问文件“D:\bwms\源代码\Dcjet.BWMS\Dcjet.Bwms.Web\PrintTmp\Check_bwms.xls”. 可能的原因有以下几 ...