第一次用倍增做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,商人從首都出發,其他各城鎮之間都有道路連線,任意兩個城鎮之間如果有直連道路,在他們之間行駛需要花費單位時間。該國公路網路發達,從首都出發能到達任意乙個城鎮,並且公路網路不會存在環。你...