codeforces 1051 F
多源点最短路。
但是有限制,m - n <= 20,边数 - 点数 <= 20, 所以这个图非常的稀疏。
任意提取出一个生成树出来,LCA处理任意两点最短路。
然后再去遍历那些多余出来的点(非树边的两个端点),看他们能不能更新答案(相当于松弛)。这里跑40个最短路预处理出来(最多40个点,但是必须在原图上跑才行)。
#include <bits/stdc++.h> using namespace std; #define time _____time
const long long inf = 1E18;
struct edge {
long long u,v,val,next;
}; edge Edge[];
edge xdge[]; int e = ;
int head[]; void addedge(int u,int v,int val) {
Edge[e].u = u;
Edge[e].v = v;
Edge[e].val = val;
Edge[e].next = head[u];
head[u] = e++; Edge[e].u = v;
Edge[e].v = u;
Edge[e].val = val;
Edge[e].next = head[v];
head[v] = e++; } int ec = ;
int head2[]; void ADD(int u,int v,int val) {
xdge[ec].u = u;
xdge[ec].v = v;
xdge[ec].val = val;
xdge[ec].next = head2[u];
head2[u] = ec++; xdge[ec].u = v;
xdge[ec].v = u;
xdge[ec].val = val;
xdge[ec].next = head2[v];
head2[v] = ec++;
} int in[];
int out[];
int time = ;
long long depth[];
long long ST[*][];
void dfs(int x,int pre)
{
in[x]=++time;
ST[time][]=x;
for (int i = head2[x];i != -;i = xdge[i].next)
if (xdge[i].v != pre){
depth[xdge[i].v] = depth[x] + xdge[i].val;
dfs(xdge[i].v,x);
ST[++time][]=x;
}
out[x]=time;
} int n,m; void Get_ST(int n){
for (int i=;i<=n;i++)
for (int j=;j<;j++){
ST[i][j]=ST[i][j-];
int v=i-(<<(j-));
if (v>&&depth[ST[v][j-]]<depth[ST[i][j]])
ST[i][j]=ST[v][j-];
}
} int RMQ(int L,int R){
if(L > R) {
swap(L,R);
}
int val=floor(log(R-L+)/log());
int x=ST[L+(<<val)-][val],y=ST[R][val];
if (depth[x]<depth[y])
return x;
else
return y;
} int fa[];
int ffind(int x) {
if(fa[x] == x) return x;
else return fa[x] = ffind(fa[x]);
}
void unit(int x,int y) {
int fx,fy;
fx = ffind(x);
fy = ffind(y);
if(fx != fy) {
fa[fx] = fy;
}
} struct bian {
int l,r,val;
}; vector<bian> duo; long long mmap[][];
map<int,int> mp;
vector<int> dian; long long dis[][];
int vis[]; typedef pair<long long,int> pli; void dij(int id,int s)
{
for(int i=;i<=n+;i++){
vis[i]=;
dis[id][i]=inf;
}
dis[id][s]=;
priority_queue<pli,vector<pli>,greater<pli> >q;
q.push(pli(,s)); while(!q.empty())
{
pli tmp=q.top();
q.pop();
int u=tmp.second;
if(tmp.first>dis[id][u]) continue;
vis[u]=; for(int i=head[u];i!=-;i = Edge[i].next){
int v=Edge[i].v;
long long w=Edge[i].val;
if(vis[v]) continue;
if(dis[id][v]>dis[id][u]+w)
{
dis[id][v]=dis[id][u]+w;
q.push(pli(dis[id][v],v));
}
}
} } int main() { scanf("%d %d",&n,&m);
int u,v;
for(int i = ; i <= n; i++) {
fa[i] = i;
head[i] = -;
head2[i] = -;
}
bian xx;
int val;
for(int i = ; i <= m; i++) {
scanf("%d %d %d",&u,&v,&val);
addedge(u,v,val);
if(ffind(u) != ffind(v)) {
unit(u,v);
ADD(u,v,val);
}
else {
dian.push_back(u);
dian.push_back(v);
}
} sort(dian.begin(),dian.end());
dian.erase(unique(dian.begin(),dian.end()),dian.end()); for(int i=;i<dian.size();i++){
//cout<<dian[i]<<endl;
dij(i + ,dian[i]);
} dfs(,);
depth[]= inf; Get_ST(time); int q;
scanf("%d",&q);
while (q--){ int x,y;
scanf("%d %d",&x,&y);
int LCA=RMQ(in[x],in[y]);
long long ans = depth[x]+depth[y]-depth[LCA]*;
for(int i = ; i < dian.size(); i++) {
ans = min(ans,dis[i + ][x] + dis[i + ][y]);
} printf("%lld\n",ans); } }
codeforces 1051 F的更多相关文章
- Codeforces 959 F. Mahmoud and Ehab and yet another xor task
\(>Codeforces\space959 F. Mahmoud\ and\ Ehab\ and\ yet\ another\ xor\ task<\) 题目大意 : 给出一个长度为 \ ...
- Codeforces 835 F. Roads in the Kingdom
\(>Codeforces\space835 F. Roads in the Kingdom<\) 题目大意 : 给你一棵 \(n\) 个点构成的树基环树,你需要删掉一条环边,使其变成一颗 ...
- Codeforces 1051 D.Bicolorings(DP)
Codeforces 1051 D.Bicolorings 题意:一个2×n的方格纸,用黑白给格子涂色,要求分出k个连通块,求方案数. 思路:用0,1表示黑白,则第i列可以涂00,01,10,11,( ...
- Codeforces 731 F. Video Cards(前缀和)
Codeforces 731 F. Video Cards 题目大意:给一组数,从中选一个数作lead,要求其他所有数减少为其倍数,再求和.问所求和的最大值. 思路:统计每个数字出现的个数,再做前缀和 ...
- CF 1051 F. The Shortest Statement
F. The Shortest Statement http://codeforces.com/contest/1051/problem/F 题意: n个点,m条边的无向图,每次询问两点之间的最短路. ...
- Codeforces 797 F Mice and Holes
http://codeforces.com/problemset/problem/797/F F. Mice and Holes time limit per test 1.5 ...
- Codeforces 622 F. The Sum of the k-th Powers
\(>Codeforces \space 622\ F. The\ Sum\ of\ the\ k-th\ Powers<\) 题目大意 : 给出 \(n, k\),求 \(\sum_{i ...
- Codeforces 379 F. New Year Tree
\(>Codeforces \space 379 F. New Year Tree<\) 题目大意 : 有一棵有 \(4\) 个节点个树,有连边 \((1,2) (1,3) (1,4)\) ...
- Codeforces 538 F. A Heap of Heaps
\(>Codeforces \space 538 F. A Heap of Heaps<\) 题目大意 :给出 \(n\) 个点,编号为 \(1 - n\) ,每个点有点权,将这些点构建成 ...
随机推荐
- LeetCode || 大杂烩w
454. 4Sum II 题意:给四个数组,每个数组内取一个数使得四个数和为0,问有多少种取法 思路:枚举为On4,考虑两个数组,On2枚举所有可能的和,将和的出现次数存入map中,On2枚举另两个数 ...
- springboot上传linux文件无法浏览,提示404错误
1.配置文件地址置换 @Componentclass WebConfigurer implements WebMvcConfigurer { @Autowired ConfigUtil bootdoC ...
- PHP 头部utf-8
只是自己用的一些存储,请各位看官大大勿怪. header("Content-Type: text/html;charset=utf-8"); 2019年04月10日
- 什么是无符号段整数,什么又是有符号数,(c++与java语言里边的不同)
c++中:整型数分为有符号数和无符号数两种 unsigned int a;无符号整型变量a,意思是这个数最小值为0,最大值为2的32次方-1,因为一个整型数占四个字节,一个字节8位,共32位 int ...
- iBeacon技术
声明:部分资料来源自互联网 前言 iBeacon 最早推出是在今年的苹果 WWDC 大会上.作为 iOS 7 的一部分,它吸引人的一点是,iBeacon 是一种开发标准——绝大多数智能手机支持蓝牙 4 ...
- vba练习资料
链接:https://pan.baidu.com/s/1E0e58rZ_3QCCorWNM-ehSA 提取码:jluf
- django-ckeditor添加代码功能(codesnippet)
最近做了一个博客,使用python3+django2.1开发的,后台编辑器和前端显示用的Django-ckeditor富文本编辑器,由于发现没有代码块功能,写上去的代码在前端展示有点乱,于是一顿问度娘 ...
- (48)zabbix报警媒介:自定义脚本Custom alertscripts
自定义脚本媒介.zabbix会将信息传递给脚本,接下来你在脚本里面随意处理,一共会传递三个参数,按顺序接受也就是$1,$2,$3了,为了方便记忆,一般分别给他们赋值到To\Subject\body 配 ...
- (1) zabbix进程构成
进程介绍 zabbix_agentd客户端守护进程,此进程收集客户端数据,例如cpu负载.内存.硬盘使用情况等 zabbix_getzabbix工具,单独使用的命令,通常在server或者proxy端 ...
- 如何用纯 CSS 创作一个永动的牛顿摆
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qKmGaJ 可交互视频教 ...