NC19814 最短路 LCA 思維

2022-05-27 10:21:12 字數 1232 閱讀 2606

這題如果注意到m的範圍,那麼思路將會豁然開朗

因為如果是一棵樹,那麼直接lca就能求得兩點間最小值

但是現在是圖,並且邊數就比一棵樹大100左右

所以我們可以想到,先將圖中取出生成樹,用lca求答案

那麼剩下就有100條邊左右未使用,我們發現,答案可能經過這些邊,因此我們列舉這些邊的端點去做01最短路,對兩種情況取min就是最後答案

直接做最短路的正確性在於,如果答案使用到了某條未在樹上的邊,那麼我們因為使用了這條邊做最短路,因此我們求得的一定是通過這條邊相關的最短距離

因此列舉全部就能獲得答案

#includeusing

namespace

std;

typedef

long

long

ll;typedef pair

pll;

const

int n=1e5+200

;const

int mod=1e9+7

;int h[n],ne[n<<1],e[n<<1

],idx,cnt;

bool st[n<<1],pos[n],used[n<<1

];int

n,m;

int lg[n<<1

];int depth[n],f[n][25],dis[210][n],from[n<<1],to[n<<1

];void add(int a,int

b)void dfs(int u,int

fa)

for(i=h[u];i!=-1;i=ne[i])

}void bfs(int

s) dis[cnt][s]=0

; queue

q;q.push(s);

while

(q.size())}}

}int lca(int a,int

b) }

if(a==b)

return

a;

for(i=21;i>=0;i--)

}return f[a][0];}

intmain()

st[0]=1

; dfs(

1,0);

for(i=0;i2

) }

intq;

cin>>q;

while(q--)

return0;

}

view code

變色DNA(最短路思維題)

個人心得 太水了,還是對最短路不太深入了解,無法構建出最短路模板,然後就是讀題能力,這題的關鍵在於轉換為最短路模板,因為dfs我在24組超時了。假設把從i到j的代價看做是權值,那麼就是對權值的確立了,顯而易見,權值跟前面出現的y的個數有關。權值建立後就可以用最短路了,特意看了下最短路深入了解了下,每...

最短路 逆向思維 字典序最小

題意 無向圖,每個點由大小寫組成,大寫字母代表城鎮,經過需要繳納 ce il s um 20 ceil sum 20 ceil sum 20費用,小寫字母代表村莊,經過需要繳納1 11費用。已經到達目的地點t tt,需要運送到的貨物,求從起點s ss需要帶的貨物的最小值,並輸出字典序最小的路線 起點...

譚鬆鬆的旅遊計畫 LCA 求最短路

譚鬆鬆是乙個愛旅遊的人,他非常的熱愛旅遊,即便身體被掏空也要堅持旅遊。喵蛤王國由n個城市組成,由n 1條道路連通,每條道路長度為ci,使得任意兩座城市都能相互到達。譚鬆鬆有m個旅遊計畫,每個旅遊計畫有乙個起點ai,乙個終點bi,所以譚鬆鬆想知道,對於每個旅遊計畫,從起點到終點的最短路長度為多少?in...