訊息的傳遞 強連通分量

2022-02-04 07:11:15 字數 1141 閱讀 9172

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

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

檔案的第一行為n,第二行至第n+1行為n*n的矩陣(若第i行第j列為1,則奸細i能將訊息直接傳遞給奸細j,若第i行第j列為0,則奸細i不能將訊息直接傳遞給奸細j)。

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

80 0 1 0 0 0 0 0

1 0 0 1 0 0 0 0

0 1 0 1 1 0 0 0

0 0 0 0 0 1 0 0

0 0 0 1 0 0 0 0

0 0 0 1 0 0 0 0

0 0 0 1 0 0 0 1

0 0 0 0 0 0 1 0

#include #include #define maxn 1005

using namespace std;

int head[maxn],cnt,r[maxn],ans;

int num,dfn[maxn],low[maxn],visit[maxn],stack[maxn],index,belong[maxn];

struct fdfdfde[500005];

void addedge(int x,int y)

void tarjan(int x)

if(low[x]==dfn[x])

while(x!=stack[index+1]); }}

int main()

cnt=0;

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

if(!dfn[i]) tarjan(i);

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

for(int j=head[i];j;j=e[j].next)

for(int i=1;i<=num;++i)

if(!r[i]) ++ans;

printf("%d\n",ans);

return 0;

}

強連通分量 tarjan求強連通分量

雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...

強連通分量

對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...

強連通分量

在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...