演算法題 網路達人問題 Python

2021-08-27 16:10:12 字數 1668 閱讀 5734

網路達人

工程師想要找到乙個網路裡面的網路達人,假設使用者數為n,有m個關注關係對(a, b)(a,b)表示使用者a關注了使用者b。關注關係具有傳遞性, 例如:使用者a關注了使用者b,使用者b關注使用者c,那麼認為使用者a間接關注了使用者c。如果乙個使用者被所有n個使用者關注或者間接關注(自己關注自己算乙個),那麼我們認為這個使用者是網路達人

示例:

輸入:

3# 代表 n

3# 代表 m12

2123

# 空格分隔 m*2 個整數,表示關注關係對

輸出:1

# 網路達人數

(1)很顯然,這種關注關係是可以組成乙個有向圖的,所以可以先把二元關係轉成鄰接矩陣儲存。

(2)然後依次選出乙個使用者,初始化乙個佇列,併入隊。

(3)然後對佇列進行操作,佇列元素依次出隊,找到自己的粉絲,然後入隊(重複的不要),出隊的過程中,是假出隊,保留佇列元素,方便後續計算。

# @time   :2018/09/09

# @author :xing

# 圖 佇列

class

solution:

defsolve

(self, n, m, nums):

follow =

for i in range(0, 2 * m, 2): # 提取2元關係

graph = [[0] * (n + 1) for _ in range(n + 1)]

for x, y in follow: # 構建鏈結矩陣

graph[x][y] = 1

cnt = 0

for user in range(1, n + 1): # 遍歷每乙個使用者

qlist =

i = 0

# 第乙個隊首元素位置

while(i < len(qlist)):

x = qlist[i] # 出隊

i += 1

# 下乙個將要出隊的元素

for j in range(1, n + 1): # 找粉絲

if graph[j][x] == 1

and j not

in qlist:

if len(qlist) == n: # 是否為被 n 個使用者直接或者間接關注,(包括自己)

cnt += 1

return cnt

if __name__ == "__main__":

# n = int(input())

# m = int(input())

# nums = list(map(int, input().split()))

n, m, nums = 3, 3, [1, 2, 2, 1, 2, 3]

solu = solution()

print(solu.solve(n, m, nums))

宣告:總結學習,有問題可以批評指正,大神可以略過哦。

演算法題 數字遊戲問題 Python

給定兩個正數m,n 0 m n 現在求,從m開始,只能加1,或者乘以2最後得到n的最小操作次數。很顯然是乙個動態規劃題目,首先考慮乙個m 1的情況,不難得出dp方程 dp 1 0 n為偶數 dp n min dp n 1 1,dp n 2 1 n為奇數 dp n min dp n 1 1,dp n ...

Python 演算法題

演算法題 提供乙個序列,完成對這個序列的分割。要求分割後的兩個序列彼此差值最小 實現函式,返回兩個序列 count 0def func i i.sort global count count 1print i i print count count ifnot i return elif len i...

演算法題 最小絕對值問題 Python

給定乙個數列 nums 裡面全是整數,且所有數字子不重複,求數列任中任意兩個值差的最小絕對值是多少?因為沒有重複項,那麼可以採用桶排序,然後遍歷獲取最小值,其實如果有重複項,也沒有關係,依舊可以採用桶排序,如果排序後長度減少,那麼絕對值最小的一定是0,因為有重複項嗎。面試題,最小絕對值,解題思路,桶...