hdu 3639 (강 한 연결 점 + 검색)
만약 에 i 개인 이 하나의 고 리 를 형성한다 면 모든 사람 이 i - 1 표 이 고 고리 사이 에 연락 이 있 을 수 있 습 니 다.
분명히 강 한 연결 점 문제 입 니 다. 링 을 점 으로 축소 한 다음 에 반 도 를 만들어 직접 검색 하면 ok 입 니 다.
#include<stdio.h>
#include<stack>
#include<string.h>
#define N 5010
using namespace std;
int n,m;
int dfs[N],low[N],belong[N],ins[N],inq[N],num[N],cont[N],vis[N];
struct edage
{
int ed;
struct edage *next;
}*E[N],*e[N];
void addedage(int x,int y)
{
struct edage *p=new edage;
p->ed=y;
p->next=E[x];
E[x]=p;
}
void Addedage(int x,int y)
{
struct edage *p=new edage;
p->ed=y;
p->next=e[x];
e[x]=p;
}
stack<int>Q;
int idx,ans;
void Tarjan(int x)
{
int v;
dfs[x]=low[x]=idx++;
Q.push(x);
ins[x]=1;
for(edage *j=E[x];j;j=j->next)
{
if(dfs[j->ed]==-1)
{
Tarjan(j->ed);
low[x]=low[x]>low[j->ed]?low[j->ed]:low[x];
}
else if(ins[j->ed]==1)
low[x]=low[x]>dfs[j->ed]?dfs[j->ed]:low[x];
}
if(low[x]==dfs[x])
{
while(1)
{
v=Q.top();
Q.pop();
ins[v]=0;
belong[v]=ans;
num[ans]++;
if(v==x)break;
}
ans++;
}
}
int DFS(int x)
{
vis[x]=1;
int sum=0;
for(edage *q=e[x];q;q=q->next)
if(vis[q->ed]==0)
sum+=(num[q->ed]+DFS(q->ed));
return sum;
}
int main()
{
int i,j,x,op=1,t,y;
scanf("%d",&t);
while(t--)
{
memset(E,NULL,sizeof(E));
memset(e,NULL,sizeof(e));
memset(dfs,-1,sizeof(dfs));
memset(ins,0,sizeof(ins));
memset(inq,0,sizeof(inq));
memset(num,0,sizeof(num));
memset(cont,0,sizeof(cont));
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
addedage(x,y);
}
idx=ans=0;
for(i=0;i<n;i++)
{
if(dfs[i]==-1)
Tarjan(i);//
}
for(i=0;i<n;i++)
{
for(edage *q=E[i];q;q=q->next)
{
if(belong[i]!=belong[q->ed])
{
inq[belong[i]]++;
Addedage(belong[q->ed],belong[i]);//
}
}
}
int max=-1;
for(i=0;i<ans;i++)
{
memset(vis,0,sizeof(vis));
if(inq[i]==0)
{
cont[i]=num[i]-1+DFS(i);
if(max<cont[i])
{max=cont[i];}
}
}
printf("Case %d: %d
",op++,max);
for(i=0;i<n;i++)
if(cont[belong[i]]==max)
break;
printf("%d",i++);
for(;i<n;i++)
if(cont[belong[i]]==max)
printf(" %d",i);
printf("
");
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux Shell 프로 그래 밍 - 텍스트 처리 grep, sed사용자 가 지정 한 '모드' 에 따라 대상 텍스트 를 일치 하 게 검사 하고 일치 하 는 줄 을 인쇄 합 니 다. ##포함 되 지 않 음, 역방향 일치 \ ##키워드 앞 뒤 가 맞지 않 고 키워드 만 일치 합 니 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.