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的塊,然後列...