[HDU 1269] 미로 성의 강력 한 연계 분량
4561 단어 도 론
제목: 중국어 문제.
사고방식: Tarjan 알고리즘, 적과 과 과 의 강력 한 연결 분량, 직접 템 플 릿 에 올 리 기
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 10005;
stack<int> sta;
vector<int> side[100005];
int time, sum;
int low[maxn], dfn[maxn];
bool instack[maxn], vis[maxn];
int Tarjan(int rt)
{
sta.push(rt);
vis[rt] = true;
instack[rt] = true;
low[rt] = dfn[rt] = ++time;
int len = side[rt].size();
for(int i = 0; i < len; i++)
{
int rw = side[rt][i];
if(!vis[rw]){
Tarjan(rw);
low[rt] = min(low[rt], low[rw]);
}
else if(instack[rw]){
low[rt] = min(low[rt], dfn[rw]);
}
}
if(low[rt] == dfn[rt]){
int top;
do{
top =sta.top();
sta.pop();
instack[top] = false;
}while(top != rt);
sum++;
}
return 0;
}
int main()
{
int n, m;
while(~scanf("%d%d", &n, &m) && (n || m)){
for(int i = 0; i <= n; i++){
side[i].clear();
}
int x, y;
for(int i = 0; i < m; i++){
scanf("%d%d", &x, &y);
side[x].push_back(y);
}
sum = time = 0;
memset(low, 0, sizeof(low));
memset(dfn, 0, sizeof(dfn));
memset(vis, false, sizeof(vis));
memset(instack, false, sizeof(instack));
for(int i = 1; i <= n; i++){
if(!dfn[i])
Tarjan(1);
}
if(sum == 1){
printf("Yes
");
}
else{
printf("No
");
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HDU 1874: 원활 한 공사 계속 [Dijkstra & SPFA & Floyd]모 성 은 여러 해 동안 의 원활 한 공사 계획 을 실행 한 후에 마침내 많은 길 을 건설 하 였 다.길 을 많이 건 너 지 않 아 도 좋 지 않다. 한 도시 에서 다른 도시 로 갈 때마다 여러 가지 도로 방안 을 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.