Improve SPAM ( 拓撲排序 )

2021-09-29 18:13:47 字數 1351 閱讀 8592

improve spam ( 拓撲排序 )

這裡有n個位址,其中m個位址是伺服器位址,編號為1~m,剩下的n-m個位址為使用者位址。每個伺服器位址都包含若干其他位址,當某個伺服器位址收到一封郵件,它會把這封郵件**給它包含的所有位址。

例如:1、2和3是郵件列表,而4和5是客戶電子郵件。

此外,郵件列表1包含郵件列表2和3,郵件列表2包含客戶電子郵件

4和5,而郵件列表3包含客戶電子郵件4和郵件列表2。現在假設

郵件被傳送到郵件列表1。這意味著該列表已按照上述說明進行處理,並且

然後還會處理郵件列表2和3。 處理郵件列表2後,該訊息

傳送到客戶電子郵件4和5。處理郵件列表3後,第二條訊息傳送到

客戶電子郵件4,並再次處理郵件列表2,這會產生傳送給客戶的第三條訊息

電子郵件4和第二條訊息傳送到客戶電子郵件5。因此,總共有5條訊息傳送到客戶電子郵件。

但是這樣4和5都收到了重複的郵件,你需要維修這個系統,使得每個使用者不會收到重複郵件。

一開始給1號位址傳送一封郵件,要求分別輸出維修前和維修後所有使用者收到的郵件總數。

思路:把每個位址當作是圖中的點,1號位址包含2,3,就讓節點1和2,3節點相連。這樣先從1跑一遍bfs ( 注意加via標記 ),如果到了使用者位址( 編號》m )ans2 ++, 這樣就可以統計不重複的送達郵件能送多少封。我們早bfs的時候記錄bfs的路徑,新建一張圖(這樣就捨棄掉了無用邊),在跑一邊拓撲排序,期間更新每個節點應該被訪問的次數,ci[to] = ci[to] + ci[from] 。

**:

#include using namespace std;

const int mod = 1e9+7;

const int maxn = 2e3+10;

long long ans1,ans2;

vectorg[maxn];

int n,m,cnt;

int via[maxn];

int head[maxn];

int in[maxn];

int ci[maxn];

struct node e[maxn*maxn];

void addage( int u, int v )

void bfs1()}}

ans1 = 0;

for ( int i=m+1; i<=n; i++ )

}int main()

}bfs1(); // bfs,找到種類數

topu(); // 拓撲排序,順便找到次數關係

printf("%lld %lld\n",ans1,ans2);

return 0;

}

python 拓撲排序 Python 拓撲排序

python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...

python 排序 拓撲排序

在電腦科學領域中,有向圖的拓撲排序是其頂點的先行排序,對於每個從頂點u到頂點v的有向邊uv,在排序的結果中u都在v之前。如果圖是有向無環圖,則拓撲排序是可能的 為什麼不說一定呢?圖論 是組合數學的乙個分支,它和其他分支比如 群論 拓撲學 矩陣論有著密切的關係。圖是圖論的主要研究物件。圖是由若干給定的...

拓撲排序演算法

對許多資料結構教材實在不滿意,至少我是看不懂 至於拓撲排序演算法,教材上那些偽 真真教人頭暈。只寫了幾個struct結構,我根本看不出這是鄰接表。如果給出乙個清晰明了的圖,一切不就簡單了?總之,關鍵就是建立乙個鄰接表。然後利用這個表進行拓撲排序。邊表結點宣告 typedef struct edgen...