POJ2762 tarjan縮點 拓撲排序

2021-08-17 20:45:18 字數 1278 閱讀 8539

有向圖n<=1000 m<=6000,

如果圖中任意兩點u,v 均有u可達v或v可達u,

輸出yes,否則輸出no

嘛,強連通分量內的點肯定互相可達

對於縮點之後的dag,怎麼判呢?

如果一開始就有多個入度為0的點,那麼就是no

交一發wa了

這時候就要想反例了

發現有一種情況也是no

比如1 2 ,1 3, 2 4, 3 4

2 3之間不可達,但是如果把點1跟1的邊去掉,

就會發現2 3同時入度為0!

所以我們不斷把入度為0的點跟邊同時去掉,

判每個階段是否同時有多個入度為0的點

而這種操作就是拓撲排序的經典操作

這種判斷不需要考慮重邊,想多了

dag不要跟原來的有向圖搞混

329ms

#include#include#include#include#include#includeusing namespace std;

const int maxn=1005;

const int maxe=6005;

int low[maxn];

int dfn[maxn];

bool ins[maxn];

int sk[maxn];

int poi=0,idx=0,cnt=0;

int num=0;

int head[maxn];

int to[maxe*2];

int nxt[maxe*2];

int n,m;

int in[maxn];//入度

int scc[maxn];

vectordag[maxn];

queueq;

void add(int u,int v)

void tarjan(int u)

else if(ins[v]) low[u]=min(low[u],dfn[v]);

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

while(t!=u); }}

bool check()//拓撲排序

}return true;

}int main()

//printf("num:%d\n",num);

for(int u=1;u<=n;u++)}}

if(check())

printf("yes\n");

else

printf("no\n");

}

}

Tarjan縮點 SPFA 縮點

洛谷p3387縮點 tarjan spfa求dag上單源最短路模板題 用tarjan在原圖上求scc 縮點 用縮點之後的scc建乙個有向無環圖 scc權為此scc內所有點點權和 在新建的dag上將scc權視為邊權跑spfa 求scc 1 到scc n 的最長路即為所求答案 include inclu...

Tarjan演算法 縮點

我們這一篇是在已經了解tarjan演算法的基礎之上開始寫的,如果不了解的話,請先看大牛們 關於tarjan演算法的部落格。首先我們對於乙個有向無環的圖 dag 至少新增幾條邊才能使它變為強連通圖?我們很容易根據有向無環圖的性質得到,我們計算入度為零的點數為a,出度為零的點數為b,那麼我們至少需要新增...

Tarjan 縮點 模板

縮點以後,整張圖變為dag 有向無環圖 此時運用拓撲排序 求出度入度就可以完成許多事 題目 include include include include include include define ll long long using namespace std const int maxn 1...