題目描述
給出一張 $n$ 個點 $m$ 條邊的無向連通圖,每條邊的邊權為1。對於每個點 $i$ ,問是否存在另乙個點 $j$ ,使得對於任意乙個不為 $i$ 或 $j$ 的點 $k$ ,$i$ 到 $k$ 的最短路與 $j$ 到 $k$ 的最短路之差為定值。求所有滿足條件的點 $i$ 。
$n\le 100000,m\le 200000$
題解結論題+hash
結論:$i$ 滿足條件,當且僅當滿足三個條件之一:
1. 點 $i$ 的度數為1;
2. 點 $i$ 與乙個度數為1的點相連;
3. 存在某個點 $j$ ,使得 $i$ 與 $j$ 和所有除 $i,j$ 以外的點是否有邊 相同。
證明參考 這裡 。
對於條件1、2很容易判斷。
對於3條件我們可以將所有與 $i$ 點相連的點hash一下即可判斷出 $i$ 與 $j$ 沒有邊的 $j$ 。
再把 $i$ 自己加進去hash一下即可判斷書 $i$ 與 $j$ 有邊的 $j$ 。
其中hash的模數要設成 $10^$ 級別。
時間複雜度為使用map判斷的 $o(m+n\log n)$
#include #include #include #define n 100010using namespace std;
typedef long long ll;
mapmp1 , mp2;
int px[n << 1] , py[n << 1] , c[n] , flag[n] , ans[n];
ll v[n] , a[n] , b[n];
int main()
for(i = 1 ; i <= n ; i ++ ) mp1[a[i]] ++ , mp2[b[i]] ++ ;
for(i = 1 ; i <= n ; i ++ )
if(c[i] == 1 || flag[i] || mp1[a[i]] > 1 || mp2[b[i]] > 1)
ans[++tot] = i;
printf("%d\n" , tot);
for(i = 1 ; i <= tot ; i ++ ) printf("%d " , ans[i]);
puts("");
} return 0;
}
uoj 175 新年的網警
在這新年的第一天,猴族首領猴腮雷打算來整治一下網路風氣。這時,他聽說在乙個叫做 universal oj 使用者群 的 qq 群中有人在散播 開 謠言 車 於是他就派了一群網警把這個使用者群裡的人都抓了回來,試圖找到謠言的源頭。這個使用者群中有 nn 個人,這些人中存在 mm 對雙向的直接認識關係,...
uoj 176 新年的繁榮
給出乙個完全圖,邊權為兩點權值的and,求最大生成樹。這題用最小生成樹的boruvka演算法。大概就是每次找到每乙個聯通塊權值最大的邊,將這些聯通塊合併,直到只剩乙個聯通塊。因為每次聯通塊的個數至少減半,所以只會做log次操作。那麼這題相當於每個點有不同顏色,要找到每個點的異色點中最大的and值。扔...
UOJ 351 新年的葉子
給出一棵樹,每次隨機選擇乙個葉子節點 可以重複選 將其染黑,問樹上不經過黑點的最長鏈變短的期望染色次數是多少。這題的主要思路是用總代價除以總方案數。樹的直徑有乙個或兩個必經點,當直徑長度為奇數時,直徑的中點即為必經點,可以將有希望成為直徑上的葉子節點根據它屬於必經點的哪棵子樹進行分類,得到多個葉子集...