機房練習賽4 3 graph

2021-07-29 23:53:38 字數 2273 閱讀 1311

input file: graph.in

output file: graph.out

time limit: 1 second

jyb 給大家講過強連通分量,強連通分量中的任意兩點之間都可以互相到達。這個條件感覺很苛刻,大部分圖

都不能滿足。現在jyb 告訴你乙個新的概念:單向連通圖;如果有向圖中,對於任意節點v1 和v2,至少存

在從v1 到v2 和從v2 到v1 的路徑中的一條,則為單向連通圖。現在給出若干個有向圖,jyb 想問你它們是

不是單向連通圖。

input

第1 行,1 個整數t, 表示資料組數,對於每組資料:

第1 行,2 個整數n;m,表示點數和邊數

接下來m 行,每行2 個整數u,v, 表示u 到v 有一條單向邊。題目保證u! = v

output

對於每組資料,如果是則輸出」yes」, 不是則輸出」no」(均不含引號)

sample

graph.in

2 3 2

1 3

2 3

3 2

1 2

2 3

graph.out

no yes

note

• 對於30% 的資料,1 n 100,1 m n2

• 對於100% 的資料,1 t 5,1 n 30000,1 m 2 105。

tarjan求scc+拓撲排序

經過tarjan縮點後,得到了乙個dag,我們很容易想到如果乙個圖「分叉」,那麼分叉上的點肯定是互不可達的,所以原圖必須是「一條鏈」。為什麼對鏈打引號呢?是因為這條鏈不用很嚴格,比如1->2 2->3 3->4 1->4 2->4這樣的圖也是滿足的,且可能還有重邊,所以只用入度出度去判斷的方法容易出錯,dfs去走一條鏈的辦法也比較麻煩(我沒想出有什麼簡單的辦法)。我們利用拓撲排序,若一直都是乙個入度為0的點(隊中至多有乙個點),那麼就是滿足題意的。(by jyb)

#include 

#include

#include

#include

using

namespace

std;

const

int maxn = 100010;

const

int maxm = 400010;

struct edgee[maxm];

int h[maxn],num,hh[maxn];

int indexx,top,stack[maxn],belong[maxn],cnt;

int p[maxn],dfn[maxn],low[maxn];

int q[maxn],head,tail;

bool vis[maxn];

int u,v,n,m;

int t;

void dfs( int u ) else

if( vis[v] && dfn[v] < low[u] ) low[u] = dfn[v];

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

}}void adde(int u,int v)

void adde2(int u,int v)

int main()

memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(p,0,sizeof(p));

for( int i = 1; i <= n; i++ ) if( !dfn[i] ) dfs(i);

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

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

if( belong[i] != belong[e[j].v] )

bool ans = true; head = tail = 0;

for( int i = 1; i <= cnt; i++ ) if(!p[i]) q[tail++] = i;

while( head < tail )

u = q[head];

for( int i = hh[u]; i; i = e[i].next)

head++;

}if( ans )printf("yes\n");else

printf("no\n");

}return

0;}

機房練習賽4 3 drive

input file drive.in output file drive.out time limit 2 second 工頭cky 最近開了一家 公司,開始經商。作為cky 的忠實小弟,jyb 當了cky 老總的司機。一天晚上,cky 突然找到了乙個新的客戶,所以第二天一早要急著從成都去上海談生...

20170117 機房 練習賽

現代科學,面廣枝繁,不是一輩子學得了的。惟一的辦法是集中精力,先打破一缺口,建立一塊或幾塊根據地,然後乘勝追擊,逐步擴大研究領域。此法單刀直入,易見成效。王梓坤 我熱愛生活,我是一名快速成長的oier include include include define program name color...

機房練習賽 Dinner

本來看到這道題的第一想法是環形區間dp的,但是模擬完樣例我就恍然大悟,在10的時間內可以同時讓1,5點完餐,那不就是找最大值得最小值嗎?然後就是二分答案了,二分最少時間。然後就是我的玄學check 我在考試的時候是想到了變成二倍鏈在區間上處理的,但我直接o n 處理了每個區間的和不大於x的塊,然後列...