这题真的有毒
首先你忽略 N-M < 100 的条件你就gg吧
其次就算你知道了怎么做之后
还有可能因为写vector或者各种常数大的原因被卡

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<map>
#include<cmath>
#include<cstring>
#include<queue>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
const int MAXN = 1e5+205; int N,M,Q;
struct Node{
int to,nex;
}mip[MAXN*2], vic[MAXN*2];
int mp[MAXN]; int mot;
int vc[MAXN]; int vot; int vis[MAXN];
int pre[MAXN]; int tag[MAXN];
int po[MAXN]; int po_cc; int cc;
void add1(int x,int y) {
mip[mot].to = y; mip[mot].nex = mp[x]; mp[x] = mot++;
mip[mot].to = x; mip[mot].nex = mp[y]; mp[y] = mot++;
}
void add2(int x,int y) {
vic[vot].to = y; vic[vot].nex = vc[x]; vc[x] = vot++;
vic[vot].to = x; vic[vot].nex = vc[y]; vc[y] = vot++;
}
map< pair<int,int>, int> mmp;
int dis[205][MAXN];
/*************LCA***************/
const int DEG=20;
int fa[MAXN][DEG];
int deg[MAXN];
void BFS(int rt) {
queue<int> qq;
deg[rt] = 0;
fa[rt][0] = rt;
qq.push(rt);
while(!qq.empty()){
int tmp = qq.front(); qq.pop();
for(int i = 1; i < DEG; ++i)
fa[tmp][i] = fa[fa[tmp][i-1]][i-1];
for(int i = vc[tmp]; i !=-1; i = vic[i].nex) {
int v = vic[i].to; if(v == fa[tmp][0]) continue;
deg[v] = deg[tmp]+1; fa[v][0]=tmp;
qq.push(v);
}
}
}
int LCA(int u,int v) {
if(deg[u] > deg[v]) swap(u,v);
int hu = deg[u], hv = deg[v];
int tu = u, tv = v;
for(int det = hv-hu, i=0; det; det>>=1, ++i) {
if(det&1) {
tv = fa[tv][i];
}
}
if(tu == tv) return tu;
for(int i = DEG-1; i >= 0; --i) {
if(fa[tu][i] == fa[tv][i]) continue;
tu = fa[tu][i];
tv = fa[tv][i];
}
return fa[tu][0];
}
/*****makedis**********/
void solve(int x) {
memset(vis,0,sizeof(vis));
queue<int> qq;
qq.push(x); dis[cc][x] = 0; vis[x] = 1; pre[x]=x;
while(!qq.empty()) {
int b = qq.front(); qq.pop();
for(int i = mp[b]; i != -1; i = mip[i].nex) {
int y = mip[i].to;
if(!vis[y]) {
// if(!cc) printf("hh %d %d\n",b,y);
dis[cc][y] = dis[cc][b]+1; vis[y] = 1; pre[y]=b;
if(!cc) {
add2(b,y);
}
qq.push(y);
}else if(pre[b] != y && !cc) {
// printf("%d %d\n",b,y);
tag[b]++; if(tag[b] == 1) po[++po_cc] = b;
tag[y]++; if(tag[y] == 1) po[++po_cc] = y;
}
}
}
}
int doo(int x,int y) {
int tt = LCA(x,y);
int ans = -dis[0][tt]*2 + dis[0][x] + dis[0][y];
if(tt == x || tt == y) return ans;
for(int i = 1; i <= po_cc; ++i) {
ans = min(ans, dis[i][x]+dis[i][y]);
}
return ans;
}
int main(){
while(~scanf("%d %d %d",&N,&M,&Q)) {
memset(mp,-1,sizeof(mp)); mot = 0;
memset(vc,-1,sizeof(vc)); vot = 0;
memset(tag,0,sizeof(tag));
mmp.clear(); po_cc = 0; cc = 0;
for(int i = 1; i <= M; ++i) {
int a,b; scanf("%d %d",&a,&b);
if(a > b) swap(a,b);
if( a == b || mmp[pi(a,b)] ) continue;
add1(a,b);
mmp[pi(a,b)] ++;
} solve(1);
BFS(1);
for(int i = 1; i <= po_cc; ++i) {
cc++; solve(po[i]);
}
for(int i = 0; i < Q; ++i) {
int a,b; scanf("%d %d",&a,&b);
printf("%d\n",doo(a,b));
}
}
return 0;
}

2016四川省赛 Floyd-Warshall的更多相关文章

  1. 2016四川省赛A,C【写了1w个if的水题】

    A题: #include <iostream> #include <stdio.h> #include <string.h> #include <algori ...

  2. 图论之最短路径(1)——Floyd Warshall & Dijkstra算法

    开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...

  3. 2016湖南省赛----G - Parenthesis (括号匹配)

    2016湖南省赛----G - Parenthesis (括号匹配)   Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of lengt ...

  4. 2016湖南省赛----A 2016 (同余定理)

    2016湖南省赛----A 2016 (同余定理) Description  给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 ...

  5. 2016湖南省赛 I Tree Intersection(线段树合并,树链剖分)

    2016湖南省赛 I Tree Intersection(线段树合并,树链剖分) 传送门:https://ac.nowcoder.com/acm/contest/1112/I 题意: 给你一个n个结点 ...

  6. SCNU ACM 2016新生赛初赛 解题报告

    新生初赛题目.解题思路.参考代码一览 1001. 无聊的日常 Problem Description 两位小朋友小A和小B无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...

  7. 2016湖南省赛 [Cloned]

    A.2016 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. Input   输入包含不超过 30 组数 ...

  8. SCNU ACM 2016新生赛决赛 解题报告

    新生初赛题目.解题思路.参考代码一览 A. 拒绝虐狗 Problem Description CZJ 去排队打饭的时候看到前面有几对情侣秀恩爱,作为单身狗的 CZJ 表示很难受. 现在给出一个字符串代 ...

  9. 2016湖南省赛--A题--2016

    2016 [TOC] Description 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. Input ...

随机推荐

  1. BZOJ 3545: [ONTAK2010]Peaks [Splay启发式合并]

    3545: [ONTAK2010]Peaks 题意:带权图,多组询问与一个点通过边权\(\le x\)的边连通的点中点权k大值 又读错题了,输出点一直WA,问的是点权啊 本题加强版强制在线了,那这道题 ...

  2. BZOJ 3622: 已经没有什么好害怕的了 [容斥原理 DP]

    3622: 已经没有什么好害怕的了 题意:和我签订契约,成为魔法少女吧 真·题意:零食魔女夏洛特的结界里有糖果a和药片b各n个,两两配对,a>b的配对比b>a的配对多k个学姐就可能获胜,求 ...

  3. BZOJ 3991: [SDOI2015]寻宝游戏 [虚树 树链的并 set]

    传送门 题意: $n$个点的树,$m$次变动使得某个点有宝物或没宝物,询问每次变动后集齐所有宝物并返回原点的最小距离 转化成有根树,求树链的并... 两两树链求并就可以,但我们按照$dfs$序来两两求 ...

  4. 安装Spring Tool Suite(STS)

    JAVA开发工具中,常用工具就是Eclipse,IntelliJ IDEA. 现在使用spring boot&cloud框架进行开发的时候,虽然可以使用上面两个工具,但都未必就真的量身定制,I ...

  5. 让我们一起摇摆 Turnipbit体感遥控车

    相信大家对Microbit是非常熟悉的,而今天我们做的这个小玩具所用的核心板是Turnipbit,是基于 Microbit开发的一块适合儿童适用的板卡.基本使用原理是一样的,这里就不多介绍了,代码这方 ...

  6. 使用js dom和jquery分别实现简单增删改

    <html><head> <meta http-equiv="Content-Type" content="text/html; chars ...

  7. solr6.6教程-基础环境搭建(二)

    在上一篇文章中已经简单介绍了solr在windows的部署,今天我们来下如何新建一个自己core. 1,core理解 如果把solr理解为个数据库的话,那么core可以理解为数据库中的一张表,其实就是 ...

  8. hihoCoder Demo Day dp

    题意:有一个机器人被困在一个的迷宫中,机器人的初始位置是,目的地是,并且它的移动方式很奇怪:只能一直向右,直到不能再向右才能把方向变成向下:只能一直向下,直到不能再向下才能把方向变成向右.迷宫中的每个 ...

  9. POJ - 2253 Frogger 单源最短路

    题意:给定n个点的坐标,问从第一个点到第二个点的最小跳跃范围.d(i)表示从第一个点到达第i个点的最小跳跃范围. AC代码 #include <cstdio> #include <c ...

  10. POJ - 1417 并查集+背包

    思路:很简单的种类并查集,利用并查集可以将所有的人分成几个集合,每个集合又分为好人和坏人集合,直接进行背包dp判断有多少种方法可以在取了所有集合并且人数正好凑足p1个好人的方案.dp(i, j)表示前 ...