Shortest Path

 Accepts: 40
 Submissions: 610
 Time Limit: 4000/2000 MS (Java/Others)
 Memory Limit: 131072/131072 K (Java/Others)
Problem Description

There is a path graph G=(V,E)G=(V,E) with nn vertices. Vertices are numbered from 11 to nn and there is an edge with unit length between iiand i + 1i+1 (1 \le i < n)(1≤i<n). To make the graph more interesting, someone adds three more edges to the graph. The length of each new edge is 11.

You are given the graph and several queries about the shortest path between some pairs of vertices.

Input

There are multiple test cases. The first line of input contains an integer TT, indicating the number of test cases. For each test case:

The first line contains two integer nn and mm (1 \le n, m \le 10^5)(1≤n,m≤10​5​​) -- the number of vertices and the number of queries. The next line contains 6 integers a_1, b_1, a_2, b_2, a_3, b_3a​1​​,b​1​​,a​2​​,b​2​​,a​3​​,b​3​​ (1 \le a_1,a_2,a_3,b_1,b_2,b_3 \le n)(1≤a​1​​,a​2​​,a​3​​,b​1​​,b​2​​,b​3​​≤n), separated by a space, denoting the new added three edges are (a_1,b_1)(a​1​​,b​1​​), (a_2,b_2)(a​2​​,b​2​​), (a_3,b_3)(a​3​​,b​3​​).

In the next mm lines, each contains two integers s_is​i​​ and t_it​i​​ (1 \le s_i, t_i \le n)(1≤s​i​​,t​i​​≤n), denoting a query.

The sum of values of mm in all test cases doesn't exceed 10^610​6​​.

Output

For each test cases, output an integer S=(\displaystyle\sum_{i=1}^{m} i \cdot z_i) \text{ mod } (10^9 + 7)S=(​i=1​∑​m​​i⋅z​i​​) mod (10​9​​+7), where z_iz​i​​ is the answer for ii-th query.

Sample Input
1
10 2
2 4 5 7 8 10
1 5
3 1
Sample Output
7
题解:最短路,本来完全暴力的最短路,果断超时,最后听了大神的想法,是求加的那三条边的最短路;让每次给的u,v找u到那三个起点的距离与
d[v]的和与v-u找最小值;还是超时,先放着吧,明天再看;
今天看了下发现自己写的很有问题,哪有那么麻烦,直接dfs下就好了,其实就是个思维题,用图论肯定超了。。。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
const int INF=0x3f3f3f3f;
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define P_ printf(" ")
#define mem(x,y) memset(x,y,sizeof(x))
const int MAXN=1e5+;
const int MOD=1e9+;
typedef long long LL;
struct Dot{
int x,y;
};
Dot dot[];
int u,v;
LL ans;
int vis[];
void dfs(int pos,int temp){
if(temp+abs(v-pos)<ans)ans=temp+abs(v-pos);
for(int i=;i<;i++){
if(vis[i])continue;
vis[i]=;
dfs(dot[i].y,temp+abs(pos-dot[i].x)+);
dfs(dot[i].x,temp+abs(pos-dot[i].y)+);
vis[i]=;
}
}
int main(){
int T;
SI(T);
int N,M;
while(T--){
SI(N);SI(M);
for(int i=;i<;i++)SI(dot[i].x),SI(dot[i].y);
LL temp=;
vis[]=vis[]=vis[]=;
for(int i=;i<=M;i++){
SI(u);SI(v);
ans=abs(v-u);
dfs(u,);
temp=(temp+ans*i)%MOD;
}
printf("%lld\n",temp);
}
return ;
}
我的超时代码:先不说超时了,这样情况都没考虑完全,都没考虑过好几条路的情况;再者这样肯定会超时了。。。
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
const int INF=0x3f3f3f3f;
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define P_ printf(" ")
#define mem(x,y) memset(x,y,sizeof(x))
const int MAXN=1e5+;
const int MOD=1e9+;
int head[MAXN<<];
int vis[MAXN];
int n,m;
int d1[MAXN],d2[MAXN],d3[MAXN];
int d[MAXN];
struct Node{
int from,to,next;
};
Node dt[MAXN<<];
int edgnum;
void add(int u,int v){
dt[edgnum].from=u;dt[edgnum].to=v;
dt[edgnum].next=head[u];
head[u]=edgnum++;
}
void dijkscra(int u){
mem(vis,);
mem(d,INF);
d[u]=;
while(true){
int k=-;
for(int i=;i<=n;i++){
if(!vis[i])if(k==-||d[i]<d[k])k=i;
}
if(k==-)break;
vis[k]=;
for(int i=head[k];i!=-;i=dt[i].next){
int u=dt[i].from,v=dt[i].to;
//printf("%d %d\n",u,v);
d[v]=min(d[v],d[u]+);
}
}
} /*
int temp;
void dfs(int u,int v,int t){
if(t>n)return;
if(u==v){
temp=min(temp,t);
return;
}
for(int i=head[u];i!=-1;i=dt[i].next){
dfs(dt[i].to,v,t+1);
}
}
*/
int main(){
int T;
SI(T);
while(T--){
SI(n);SI(m);
int a1,a2,a3,b1,b2,b3;
edgnum=;mem(head,-);
for(int i=;i<n;i++)add(i,i+),add(i+,i);
scanf("%d%d%d%d%d%d",&a1,&b1,&a2,&b2,&a3,&b3);
add(a1,b1);add(b1,a1);add(a2,b2);add(b2,a2);add(a3,b3);add(b3,a3);
__int64 ans=;
dijkscra(a1);
for(int i=;i<=n;i++)d1[i]=d[i];
dijkscra(a2);
for(int i=;i<=n;i++)d2[i]=d[i];
dijkscra(a3);
for(int i=;i<=n;i++)d3[i]=d[i]; for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
/*dijkscra(u);*/
int temp=min(min(abs(v-u),abs(u-a1)+d1[v]),min(abs(u-a2)+d2[v],abs(u-a3)+d3[v]));
//printf("%d\n",temp);
ans=(ans+temp*i)%MOD;
}
printf("%I64d\n",ans);
}
return ;
}

Shortest Path(思维,dfs)的更多相关文章

  1. zoj 2760 How Many Shortest Path 最大流

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1760 Given a weighted directed graph ...

  2. 【ZOJ2760】How Many Shortest Path

    How Many Shortest Path 标签: 网络流 描述 Given a weighted directed graph, we define the shortest path as th ...

  3. ZOJ 2760 - How Many Shortest Path - [spfa最短路][最大流建图]

    人老了就比较懒,故意挑了到看起来很和蔼的题目做,然后套个spfa和dinic的模板WA了5发,人老了,可能不适合这种刺激的竞技运动了…… 题目链接:http://acm.zju.edu.cn/onli ...

  4. ZOJ 2760 How Many Shortest Path(最短路径+最大流)

    Description Given a weighted directed graph, we define the shortest path as the path who has the sma ...

  5. hdu6446 Tree and Permutation 2018ccpc网络赛 思维+dfs

    题目传送门 题目描述:给出一颗树,每条边都有权值,然后列出一个n的全排列,对于所有的全排列,比如1 2 3 4这样一个排列,要算出1到2的树上距离加2到3的树上距离加3到4的树上距离,这个和就是一个排 ...

  6. zoj How Many Shortest Path

    How Many Shortest Path 题目: 给出一张图,求解最短路有几条.处理特别BT.还有就是要特别处理map[i][i] = 0,数据有不等于0的情况! 竟然脑残到了些错floyd! ! ...

  7. Codefroces Educational Round 27 845G Shortest Path Problem?

    Shortest Path Problem? You are given an undirected graph with weighted edges. The length of some pat ...

  8. CF938G Shortest Path Queries 和 CF576E Painting Edges

    这两道都用到了线段树分治和按秩合并可撤销并查集. Shortest Path Queries 给出一个连通带权无向图,边有边权,要求支持 q 个操作: x y d 在原图中加入一条 x 到 y 权值为 ...

  9. leetcode_1293. Shortest Path in a Grid with Obstacles Elimination_[dp动态规划]

    题目链接 Given a m * n grid, where each cell is either 0 (empty) or 1 (obstacle). In one step, you can m ...

随机推荐

  1. delphi 获取北京时间(使用XMLHTTP获取百度的时间,WebBrowser获取www.timedate.cn的时间)

    方法一: uses ComObj, DateUtils; function GetInternetTime: string; var XmlHttp: OleVariant; datetxt: str ...

  2. Inno Setup技巧[界面]添加和自定义左下角标签

    原文 http://blog.sina.com.cn/s/blog_5e3cc2f30100cc49.html 本文介绍添加和自定义“左下角标签”的方法. 界面预览: Setup技巧[界面]添加和自定 ...

  3. LoadRunner Tutorial

    LoadRunner Tutorial Welcome to the LoadRunner tutorial. The tutorial is a self-paced guide that lead ...

  4. C语言的本质(26)——C标准库之数值字符串转换

    C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. #include <stdlib.h> int atoi(const char *nptr); a ...

  5. 2014第7周1Web安全概念学习

    晚上没有加班,回来后尝试几个感觉不错的行动:1.列出当天最有意义的五件事:2.靠墙站,纠正自己的姿势同时锻炼眼睛:这两点以后也要坚持成为每天的习惯.然后我又陷入了知乎的各种信息中,一个多小时的时间悄悄 ...

  6. accel-pptp 部署

    accel-pptp 是 pptp-client 和 pptpd 的改进版,使用内核 pptp 模块,相比 raw socket 实现方式能提供更好的性能.   Ubuntu 12.04 上启用内核 ...

  7. JavaScript声音播放

    方式一: /** * 播放音频(Chrome.opera)支持 * @param file:支持 rm,mid,wav */ function playAudio(file) { var embed= ...

  8. 云脉表格识别开放SDK接入

    通过深度的引擎识别和文本处理技术给予表单提供了无与伦比的文档分析和数据的提取功能,云脉表单识别包含了先进的模板学习和文本.图像分析提取技术,通过模板元素定义表单,将整个南表单生命周期和生产数据以自动化 ...

  9. vs2010编译live555源码

    最近加入了公司的C++视频小组,利用中秋这个假期将研究了一些live555的源码,现在先将如何编译使用vs2010编译live555,整理出来,对以后分析代码有很大帮助. 1.下载live555源码, ...

  10. R基础

    R的对象类型包括数值型(numeric),复数型(complex),逻辑型(logical),字符型(character)和原味型(raw),列表(list)递归结构:函数(function)和表达式 ...