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\) ,每个点有点权,将这些点构建成 ...
随机推荐
- 基于Passthru的NDIS开发的个人理解
这几天对NDIS的学习,基本思路是:首先熟悉理论知识→然后下载一个例子进行研究→最后例子自己模仿扩展→最最后尝试自己写一个新的. Passthru是微软NDIS自己写的一个框架驱动,NDIS开发者可以 ...
- tableview和searchbar的适配
iOS7中,如果用UITableViewStyleGrouped的话,里面的 cell会比原来的拉长了,这样做应该是为了统一和UITableViewStylePlain风格时cell的大小一致,所以改 ...
- PHP必知必会
MQ(消息队列) 消息队列主要用于以下场景: 1. 上传图片,用户需要迅速反馈,把上传图片的后续操作交给consumer 2. A用户对B用户发消息 3. 日志记录,APP发生的任何警告错误日志都要被 ...
- [LUOGU] P2716 和谐的雪花
https://www.luogu.org/problemnew/show/P2716 给出一个n*m的矩形,求里面边长最小的正方形,使得该正方形内最大值与最小值的差大于等于给定的K. 第一反应是二分 ...
- (39)zabbix snmp自定义OID nginx监控实例
为什么要自定义OID? 前面的文章已经讲过zabbix如何使用snmp监控服务器,但是他有一个很明显的局限性:只能监控定义好的OID项目 假如我们想知道nginx进程是否在运行?在没有zabbix a ...
- Python基础-__main__
Python基础-_main_ 写在前面 如非特别说明,下文均基于Python3 一.__main__的官方解释 参考 _main_ -- Top-level script environment ' ...
- Ajax四步操作
第一步得到(XMLHttpRequest)function creatXMLHttpRequest(){ try{ return new XMLHttpRequest(); } catch(e){ t ...
- LeetCode(110) Balanced Binary Tree
题目 Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bina ...
- HashMap图解
HashMap的数据结构和put.get.resize等操作的图解,看图轻松掌握HashMap (目前还不包括红黑树相关的部分) HashMap数据结构如下图 HashMap之put操作如下图 Has ...
- PAT Basic 1071
1071 小赌怡情 常言道“小赌怡情”.这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注 t 个筹码后,计算机给出第二个数.若玩家猜对了,则 ...