题意:现在已有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的更多相关文章

  1. 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 ...

  2. Traffic Network in Numazu

    Traffic Network in Numazu 题目描述 Chika is elected mayor of Numazu. She needs to manage the traffic in ...

  3. bnuoj 33648 Neurotic Network(树形模拟题)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=33648 [题解]:结果先对MOD*2取模,才能得到结果是否是正确的奇偶问题,得到最后结果之后再对MO ...

  4. HDU - 6393 Traffic Network in Numazu(树链剖分+基环树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6393 题意 给n个点和n条边的图,有两种操作,一种修改边权,另一种查询u到v的最短路. 分析 n个点和n条边,实 ...

  5. HDU contest808 ACM多校第7场 Problem - 1008: Traffic Network in Numazu

    首先嘚瑟一下这场比赛的排名:59 (第一次看到这么多 √ emmmm) 好了进入正文QAQ ...这道题啊,思路很清晰啊. 首先你看到树上路径边权和,然后还带修改,不是显然可以想到 树剖+线段树 维护 ...

  6. hdu 6393 Traffic Network in Numazu (树链剖分+线段树 基环树)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6393 思路:n个点,n条边,也就是基环树..因为只有一个环,我们可以把这个环断开,建一个新的点n+1与之相 ...

  7. HDU - 6393 Traffic Network in Numazu (LCA+RMQ+树状数组)

    这道题相当于将这两题结合: http://poj.org/problem?id=2763 http://codeforces.com/gym/101808/problem/K 题意:有N各点N条边的带 ...

  8. HDU - 6393 Traffic Network in Numazu (基环树+树链剖分/LCA)

    题意:给定一个带权边无向基环树,有两种操作,一种是改变某个边的权值,另一种是询问两点间的最短路径. 可以对环进行缩点,以环为根建立一棵新树,并记录与环相连的所有点和环上的哪个点相连,将路径分为环外和环 ...

  9. hdu6393 Traffic Network in Numazu 树链剖分

    题目传送门 题意:给出n个点n条边的无向带权图,再给出两种操作,操作1是将第x条边的边权修改为y,操作2是询问点x到点y的最短路径. 思路:如果是n个点n-1条边,题目就变成了树,修改边权和询问最短路 ...

随机推荐

  1. ARP协议详解

    ARP协议:地址解析协议,将IP地址映射到MAC地址. ARP缓存:每个主机都有存储IP地址和MAC地址的缓冲区.每条记录最长生存时间为10分钟,如果一条记录2分钟没有使用,则会被删除.如果始终在使用 ...

  2. 模拟抛硬币(C语言实现)

    实现代码: #include<stdio.h> #include<stdlib.h> int heads() { ; } int main(int argc, char *ar ...

  3. Web应用登出后防止浏览器后退

    通常情况下,浏览器会对页面进行缓存,此时可以通过后退访问刚才的页面,如:Web应用登出后后退能够访问刚才被缓存的页面,这样在有些情况下是不够安全的,解决防止后退的办法如下: response.setH ...

  4. Unity3d 动态批处理的问题

    这段时间做unity3d的优化,主要的入手是减少draw call.    1.代码上主要是把一些零碎的同材质的合并成一个大的mesh.    2.减少不必要的全屏后期处理.把摄像机的renderin ...

  5. php学习日志(4)-The mbstring extension is missing. Please check your PHP configuration错误及解决方法

    在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring extension is missing. Please che ...

  6. Vim一些实用的用法

    打开多个文件: 1.vim还没有启动的时候:在终端里输入 vim file1 file2 ... filen便可以打开所有想要打开的文件2.vim已经启动输入:open file可以再打开一个文件,并 ...

  7. pyQuery

    pyquery – PyQuery complete API 选择器基本支持jQuery用法 class pyquery.pyquery.PyQuery(*args, **kwargs) The ma ...

  8. django - transaction

    def user_atomic(): User.objects.create(name='purk1', email='pwu1@maxprocessing.com') User.objects.cr ...

  9. openerp经典收藏 深入理解工作流(Workflow)(转载)

    深入理解工作流(Workflow) 原文:http://shine-it.net/index.php/topic,2494.0.html 一.工作流定义:<?xml version=" ...

  10. Sublime Text博客插件 --- iblog

    iblog是一款 sublime 博客插件,目前只支持cnblog. 项目地址:https://github.com/iskeeter/iblog 功能介绍 新建和更新cnblog的博客 支持mark ...