在這新年的第一天,猴族首領猴腮雷打算來整治一下網路風氣。這時,他聽說在乙個叫做 universal oj 使用者群 的 qq 群中有人在散播(開)謠言(車),於是他就派了一群網警把這個使用者群裡的人都抓了回來,試圖找到謠言的源頭。
這個使用者群中有 nn 個人,這些人中存在 mm 對雙向的直接認識關係,這個社交網路中任意兩個人都是直接或者間接認識的。經過研究,謠言的散播以如下的方式進行:
首先在某個時刻 tt,謠言的源頭想出了乙個謠言,於是他在時刻 t+1t+1 把這個謠言講給了所有和他直接認識的人聽。
如果乙個人在第 ii 個時刻第一次聽到了這個謠言,他會在第 i+1i+1 時刻時把這個謠言講給所有和他直接認識的人聽。
現在網警們問出來每乙個人第一次聽到這個謠言的時間,但是遺憾的是他們並不知道 tt 的具體數值。而且,謠言的發起者不會坐以待斃,他可以隨便回答乙個時間(當然也可以回答真實時間),而其他不是謠言的源頭的人一定不會撒謊。(注意:網警知道謠言的發起者可以說謊)
猴族首領猴腮雷根據網警們遞交上來的口供,非常輕易的就推理出了謠言的源頭是誰並把他繩之以法。但是他發現,有些情況下,根據口供還不能唯一確定嫌疑人(即嫌疑人可能有多個),於是他想要知道哪些人是「安全的謠言發起人」。
乙個人是安全的謠言發起人,當且僅當他可以通過捏造口供使得猴腮雷無法唯一確定嫌疑人(具體可以看樣例解釋)。
%%%羊老師教我做題。
等於是問是否有另乙個點到各點距離和當前點一樣。
顯然,這個點的距離不能超過2。然後容易想到這兩個點的連邊情況要完全一樣(忽略他們相互連邊)。
然後就完了嗎?偷看題解,發現還有兩種情況:
1、度數為1的點。
2、連向度數為1的點的點。
容易證明
然後hash判邊是否相同。
code:
#include
#include
#include
#include
#include
#define ll unsigned long long
using
namespace
std;
const ll base=10037;
mapint> mp;
ll pre[100010],hash[100010];
int n,m,d[100010],ans[100010];
struct nodea[400010];int len,last[100010];
inline
void write(int x)
int read()
while(ch>='0'&&ch<='9')
return x*f;
}void ins(int x,int y)
int main()
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++) mp[hash[i]]++;
int k=0;
for(int x=1;x<=n;x++)
}if(flag) k++,ans[x]=1;}}
mp.clear();
for(int i=1;i<=n;i++) hash[i]+=pre[i],mp[hash[i]]++;
for(int i=1;i<=n;i++)
if(ans[i]==0&&mp[hash[i]]>1) k++,ans[i]=1;
write(k);putchar('\n');
for(int i=1;i<=n;i++)
if(ans[i]) write(i),putchar(' ');
putchar('\n');
}}
uoj 175 新年的網警 結論題 Hash
題目描述 給出一張 n 個點 m 條邊的無向連通圖,每條邊的邊權為1。對於每個點 i 問是否存在另乙個點 j 使得對於任意乙個不為 i 或 j 的點 k i 到 k 的最短路與 j 到 k 的最短路之差為定值。求所有滿足條件的點 i n le 100000,m le 200000 題解結論題 has...
uoj 176 新年的繁榮
給出乙個完全圖,邊權為兩點權值的and,求最大生成樹。這題用最小生成樹的boruvka演算法。大概就是每次找到每乙個聯通塊權值最大的邊,將這些聯通塊合併,直到只剩乙個聯通塊。因為每次聯通塊的個數至少減半,所以只會做log次操作。那麼這題相當於每個點有不同顏色,要找到每個點的異色點中最大的and值。扔...
UOJ 351 新年的葉子
給出一棵樹,每次隨機選擇乙個葉子節點 可以重複選 將其染黑,問樹上不經過黑點的最長鏈變短的期望染色次數是多少。這題的主要思路是用總代價除以總方案數。樹的直徑有乙個或兩個必經點,當直徑長度為奇數時,直徑的中點即為必經點,可以將有希望成為直徑上的葉子節點根據它屬於必經點的哪棵子樹進行分類,得到多個葉子集...