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\) ,每个点有点权,将这些点构建成 ...
随机推荐
- Web中打印的各种方案参考
http://blog.csdn.net/chinahuyong/article/details/42527491
- html输入框去除记忆功能
自动完成功能,只需把AUTOCOMPLETE设为off即可,如: 整个表单禁止自动完成 HTML code <FORM method=post action="submit.asp&q ...
- ZOJ-1360 || POJ-1328——Radar Installation
ZOJ地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=360 POJ地址:http://poj.org/problem?id ...
- 洛谷 p1141 01迷宫题解
很长时间没发博客了,今天水一下 很多dalao说染色(普通的)过不了, 我怎么就过了 其实我也是今天才知道什么是染色(由@你听风在吼 dalao指导) 然后自己打了一个,也不知道叫不叫染色,反正是过了 ...
- lucene测试类
package test.lucene; import java.io.BufferedReader;import java.io.File;import java.io.FileInputStrea ...
- CS193p Lecture 5 - View Controller Lifecycle
1. UITextView @property(nonatomic,readonly,retain) NSTextStorage *textStorage 是 NSMutableAttributedS ...
- OpenWrt 路由器如何让 lan 口主机获得 ipv6 网络访问 -- 知乎
本文转自知乎: OpenWrt 路由器如何让 lan 口主机获得 ipv6 网络访问? - mistforest的回答 - 知乎https://www.zhihu.com/question/29667 ...
- centos7下添加开机启动
在/etc/systemd/system下创建weblogic .Service touch weblogic.Service 添加启动权限 chmod +x weblogic.Service 编辑w ...
- perl学习之:subs函数
在Perl中,sub关键字主要是为了定义一个子例程,那么subs又是什么呢? 首先subs是一个函数,用于预先声明子例程,函数的参数是预声明的函数名列表.那么这个函数存在的意义是什么?首先,通过该函数 ...
- 格式化输出,基本运算符,流程控制主if
5.5自我总结 一.格式化输出 1.占位符 a = 1 b = 2 print('%S %s'%(a,b)) #1 2 print('%s %s'%(1,2)) #1 2 2.format格式化 a ...