hdu1269 迷宫城堡(tarjan或并查集)
tarjan 46MS:
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define MAXN 10005
vector<int> adjlist[MAXN];
int bcnt,times,dfn[MAXN],low[MAXN],stk[MAXN],top;
bool instk[MAXN];
inline int Min(int a,int b)
{
return a<b?a:b;
}
void dfs(int u)
{
dfn[u]=low[u]=++times;
stk[++top]=u;
instk[u]=true;
for(vector<int>::size_type sz=0; sz<adjlist[u].size(); sz++)
{
int v=adjlist[u][sz];
if(dfn[v]==0)
{
dfs(v);
low[u]=Min(low[u],low[v]);
}
else if(instk[v]);
low[u]=Min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
bcnt++;
int j;
do
{
j=stk[top--];
instk[j]=false;
}
while(j!=u);
}
}
int main()
{
int n,m,i,j;
while(scanf("%d %d",&n,&m) , n+m )
{
for(i=1; i<=n; i++) adjlist[i].clear();
while(m--)
{
scanf("%d %d",&i,&j);
adjlist[i].push_back(j);
}
top=-1;
times=bcnt=0;
memset(dfn,0,sizeof(*dfn)*(n+1));
memset(low,0,sizeof(*low)*(n+1));
memset(instk,false,sizeof(instk));
for(i=1; i<=n; i++)
if(dfn[i]==0)
dfs(i);
if(bcnt>1) printf("No\n");
else printf("Yes\n");
}
return 0;
}
//*******************************************************************
mfs 31ms:
#include <stdio.h>
#include <string.h>
#define MAXN 10005
int n,father1[MAXN],father2[MAXN];
int find1(int x)
{
int i,t;
for(i = x; i != 1 && father1[i] > 0; i=father1[i] );
while(x!=i)
{
t=father1[x];
father1[x]=i;
x=t;
}
return i;
}
int find2(int x)
{
int i,t;
for(i = x; i != 1 && father2[i] > 0; i=father2[i] );
while(x!=i)
{
t=father2[x];
father2[x]=i;
x=t;
}
return i;
}
inline void merge(int x,int y)
{
int fx,fy;
if(x!=1)
{
fx=find1(x);
fy=find1(y);
if(fx!=fy) father1[fx]=fy;
}
if(y!=1)
{
fx=find2(x);
fy=find2(y);
if(fx!=fy) father2[fy]=fx;
}
}
bool judge()
{
int i;
for(i=2; i<=n; i++)
if(find1(i)!=1 || find2(i)!=1)
return false;
return true;
}
int main()
{
int m,i,j;
while(scanf("%d %d",&n,&m),n+m)
{
memset(father1,-1,sizeof(*father1)*(n+1));
memset(father2,-1,sizeof(*father2)*(n+1));
while(m--)
{
scanf("%d %d",&i,&j);
merge(i,j);
}
if(judge()) printf("Yes\n");
else printf("No\n");
}
return 0;
}
浙公网安备 33010602011771号