[집합 판단 연통 무 환 도]
4203 단어 병 찰 집
HDU - 1272 | HDU - 1325 소희 의 미로 | Is it a tree?
http://acm.hdu.edu.cn/showproblem.php?pid=1272
http://acm.hdu.edu.cn/showproblem.php?pid=1325
그림 이 나무 (연결, 고리 없 음) 인지 판단 하 는 두 가지 관건:
일단 간단 한 1272.
#include
#include
#include
using namespace std;
const int maxn = 1e5 + 1e4;
int pre[maxn],s[maxn],vis[maxn];
int pcnt,ecnt,retflag;
void init()
{
for(int i = 0;i < maxn;i++)
{
pre[i] = i;
s[i] = 1;
vis[i] = 0;
}
pcnt = ecnt = 0;
retflag = 1;
}
int Find(int x)
{
while(x != pre[x])
{
pre[x] = pre[pre[x]];
x = pre[x];
}
return x;
}
void join(int a,int b)
{
int u = Find(a);
int v = Find(b);
if(u == v)
{
retflag = 0;
}
else
{
if(!vis[a] && u == a)vis[a] = 1,pcnt++;
if(!vis[b] && v == b)vis[b] = 1,pcnt++;
ecnt++;
if(s[u] > s[v])
{
pre[v] = u;
s[u] += s[v];
}
else
{
pre[u] = v;
s[v] += s[u];
}
}
}
int main()
{
int a,b;
init();
while(~scanf("%d%d",&a,&b))
{
if(a == b && a == -1)break;
if(a == b && a == 0)
{
if(ecnt == 0)printf("Yes
");
else if(!retflag || ecnt + 1 != pcnt)
{
printf("No
");
}
else printf("Yes
");
init();
}
else if(!retflag)
{
continue;
}
else
{
join(a,b);
}
}
return 0;
}
기본적으로 대부분이 템 플 릿 을 끼 워 넣 어야 하기 때문에 따로 말 하지 않 습 니 다. 경로 압축 과 균형 트 리 가 있어 야 하지만 시간 이 느 립 니 다. 데이터 의 범 위 를 모 르 기 때문에 매번 업데이트 횟수 가 GG 가 많 고 1325 는 약간 바 뀌 었 습 니 다.
1325
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1e6;
int pre[maxn],vis[maxn],in[maxn];
int pcnt,ecnt,retflag;
void init(int n = 1e5 + 1e4)
{
for(int i = 0;i <= n;i++)
{
pre[i] = i;
vis[i] = 0;
in[i] = 0;
}
pcnt = ecnt = 0;
retflag = 1;
}
int Find(int x)
{
while(x != pre[x])
{
pre[x] = pre[pre[x]];
x = pre[x];
}
return x;
}
void join(int a,int b)
{
int u = Find(a);
int v = Find(b);
if(u == v)
{
if(!vis[u])vis[u] = 1,pcnt++;
retflag = 0;
}
else
{
if(!vis[a] && u == a)vis[a] = 1,pcnt++;
if(!vis[b] && v == b)vis[b] = 1,pcnt++;
ecnt++;
if(++in[b] > 1)retflag = 0;
pre[u] = v;
}
}
int main()
{
int a,b,cas = 1;
int retn = 0;
init();
while(~scanf("%d%d",&a,&b))
{
if(a < 0 || b < 0)break;
retn = max(retn,max(a,b));
if(a == b && a == 0)
{
if(ecnt == 0 && pcnt == 0)printf("Case %d is a tree.
",cas++);
else if(!retflag || ecnt + 1 != pcnt)
{
printf("Case %d is not a tree.
",cas++);
}
else printf("Case %d is a tree.
",cas++);
init(retn);
}
else if(!retflag)
{
continue;
}
else
{
join(a,b);
}
}
return 0;
}
1325 이 문 제 는 사람 을 함정 에 빠 뜨리 는 곳 이 하나 있 는데 바로 끝 에 a 또는 b 라 고 판단 하 는 것 이다. 하 나 는 마이너스 이다. 내 가 왜 항상 re 라 고 했 는데 원래 a [- 2] 를 방 문 했 구나.
다른 건 다 좋아요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
항 저 우 전기 1878 오 라 회 로 (오 라 회 로 의 판단)오 라 회 로 는 펜 이 지면 을 떠 나 지 못 하 게 그림 의 각 변 을 한 번 만 그 릴 수 있 고 출발점 으로 돌아 갈 수 있 는 회 로 를 말한다.이제 오 라 회 로 가 있 는 지 그림 을 정 해 주 시 겠 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.