Loj10094 訊息的傳遞

2022-05-19 02:23:39 字數 1541 閱讀 3643

題目描述

我們的郭嘉大大在曹操這過得逍遙自在,但是有一天曹操給了他乙個任務,在建鄴城內有 nnn 個袁紹的奸細,將他們從 111 到 nnn 進行編號,同時他們之間存在一種傳遞關係,即若ci,j=1c_=1c​i,j​​=1,則奸細 iii 能將訊息直接傳遞給奸細 jjj。

現在曹操要發布乙個假訊息,需要傳達給所有奸細,而我們的郭嘉大大則需要傳遞給盡量少的奸細使所有的奸細都知道這乙個訊息,問我們至少要傳給幾個奸細?

輸入格式

檔案的第一行為 nnn,第二行至第 n+1n+1n+1 行為 n×nn \times nn×n 的矩陣(若第 iii 行第 jjj 列為 111,則奸細 iii 能將訊息直接傳遞給奸細 jjj,若第 iii 行第 jjj 列為 000,則奸細 iii 不能將訊息直接傳遞給奸細 jjj)。

輸出格式

輸出檔案只有一行:即我們的郭嘉大大首先至少要傳遞的奸細個數。

這題為什麼用鄰接矩陣輸入。。。。

我們可以把整個圖用tarjan縮點,保證每個聯通分量內所得的奸細只要有乙個人得到,那麼所有人得到。

再將縮好的點求一下入度,入度為0的說明是需要傳遞的。

#include #include 

#include

#include

#include

#include

#define in(a) a=read()

#define rep(i,k,n) for(int i=k;i<=n;i++)

#define maxn 2000010

using

namespace

std;

inline

intread()

intn,a,ans,num;

inttotal,head[maxn],to[maxn],nxt[maxn];

intlow[maxn],bel[maxn],dfn[maxn],cnt,vis[maxn],indu[maxn];

inline

void adl(int a,int

b)stack

s;inline

void tarjan(int

u)

else

if(vis[to[e]]) low[u]=min(low[u],dfn[to[e]]);

}if(low[u]==dfn[u])

return;}

intmain()

rep(i,

1,n)

if(!dfn[i])

tarjan(i);

rep(u,

1,n)

for(int e=head[u];e;e=nxt[e])

if(bel[u]!=bel[to[e]])

indu[bel[to[e]]]++;

rep(i,

1,num)

if(!indu[i])

ans++;

cout

<}

訊息的傳遞

題目描述 訊息單向傳遞,求最少給多少人使得所有人都知道訊息。思路顯然對於強連通分量中的點可互相到達,無需考慮,我們縮點之後,對於dag,只要將訊息傳給入度為0的人即可,其他人必定可以通過渠道得到訊息。include using namespace std const int n 1100,m 1e6...

MFC的訊息傳遞機制

今天又研究了一下mfc的訊息傳遞機制,發現mfc的訊息傳遞也沒那麼複雜。簡單的就是那麼幾個要點 1 用巨集定義了乙個訊息表,每個類一張表,父類子類通過指標連線,構成乙個訊息網。表裡面每項就定義了訊息號 id號和函式執行入口及函式引數形式。得到乙個訊息,就和表裡面的項比較,訊息一樣的就執行對應的函式。...

視窗訊息的傳遞(二)

本文根據codeproject的一片文章翻譯 當乙個視窗接收到某個訊息後,mfc將呼叫類的成員函式。但是mfc如何知道該呼叫哪個函式呢?為了解決上述問題,mfc運用了乙個叫做訊息對映 message map 機制。訊息對映就是將訊息和所要呼叫的函式繫結在一起。一旦接受到乙個訊息,mfc將進入訊息對映...