有向圖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...