LCA SSL 1746 商務旅行

2021-08-20 02:47:53 字數 1823 閱讀 3139

第一次用倍增做lc

a lca

給定乙個

n n

個點,n−

1' role="presentation" style="position: relative;">n−1

n−1條邊的五項圖,給定

m m

個點,求走完它們所有點的長度

乍看似乎是搜尋,然而絕對超時,正解是用lc

a' role="presentation" style="position: relative;">lca

lca去解決,我們把商人的路線看作第二張圖,lc

a lca

求的是第一張圖的祖先,但計算的時候得用第二張圖,在lc

a lca

的過程中,儲存層數就可以計算距離啦!

#include

#include

#include

#define min(a,b) a#define n 30001

using

namespace

std;bool ok;

int l[n],n,m,last,tot,root,f[n],w[n],ans[n],d[n],sum;

short vis[n];

struct nodeedge[n<<1];//鄰接表

void add(int u,int v)//鄰接表

int find(int x)//並查集

vector

num[n],id[n];//儲存相同點連線的路,相當於乙個另類鄰接表,時間複雜度和鄰接表相同,id是儲存它出現的順序

int read()//輸入流

void write(int x)//輸出流

void lrz()//輸入

return;

}void dfs(int k)

for(int i=0;iint y=num[k][i],id=id[k][i];//取出點和座標

if(vis[y]==2)

}vis[k]=2;//標記找過

return;

}void add(int x,int y,int k)//建造第二張圖

int main()

dfs(1);//tarjan

for(int i=1;i<=m;i++) sum+=ans[i];//求和

write(sum);//輸出

}

#include

#include

#define swap(a,b) //交換

#define n 30001

using

namespace

std;

int n,m,maxn,d[n],l[n],fa[n],tot,f[n][17],last,ans,now;

struct nodeedge[n<<1];//鄰接表

void add(int u,int v)//建邊

int read()//輸入流

void write(int x)//輸出流

void lrz()//輸入

return;

}void dfs(int k,int dep)

return;

}void bz()//倍增

int lca(int x,int y)//求x,y的最近公共祖先

if(x==y) return x;//若到達它們的祖宗,返回

return fa[x];//返回x的祖宗,因為x一定比y大(前面已經交換過)

}int main()

write(ans);//輸出

}

SSL1746 商務旅行 lca

商務旅行 time limit 11000ms memory limit 65536k total submit 79 accepted 43 case time limit 1000ms description 某首都城市的商人要經常到各城鎮去做生意,他們按自己的路線去做,目的是為了更好的節約時間...

《商務旅行》解題報告

商務旅行 解題報告 by mps 題目描述 某首都城市的商人要經常到各城鎮去做生意,他們按自己的路線去做,目的是為了更好的節約時間。假設有n個城鎮,首都編號為1,商人從首都出發,其他各城鎮之間都有道路連線,任意兩個城鎮之間如果有直連道路,在他們之間行駛需要花費單位時間。該國公路網路發達,從首都出發能...

CodeVS1036 商務旅行

某首都城市的商人要經常到各城鎮去做生意,他們按自己的路線去做,目的是為了更好的節約時間。假設有n個城鎮,首都編號為1,商人從首都出發,其他各城鎮之間都有道路連線,任意兩個城鎮之間如果有直連道路,在他們之間行駛需要花費單位時間。該國公路網路發達,從首都出發能到達任意乙個城鎮,並且公路網路不會存在環。你...