hdu 1269 迷宫城堡

迷宫城堡

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 29   Accepted Submission(s) : 12

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。

Input

输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。

Output

对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。

Sample Input

3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0

Sample Output

Yes
No

Author

Gardon

Source

HDU 2006-4 Programming Contest

。。。。迭代器方法

#include <iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;

set<int> s[100005],sv;
int vis[100005];
int n,m,i,x,y,flag;

void dfs(int ori,int room)
{
    set<int>::iterator it=s[room].begin();
    while(it!=s[room].end())
    {
        if (vis[*it]) { it++; continue;}
        vis[*it]=1;
        sv.insert(*it);
        dfs(ori,*it);
        it++;
    }
    return;
}
int main()
{
    while(~scanf("%d%d",&n,&m),n)
    {
        for(i=1;i<=n;i++) s[i].clear();
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            s[x].insert(y);
        }
        flag=1;
       for(i=1;i<=n;i++)
       {
         memset(vis,0,sizeof(vis));
         sv.clear();
         vis[i]=1;
         dfs(i,i);
         if(sv.size()!=n-1) {flag=0; break;}
       }
        if (flag) printf("Yes\n");
          else printf("No\n");
    }
    return 0;
}

tarjan算法。。

#include <iostream>
#include<cstring>
#include<cstdio>
#include<deque>
#include<algorithm>
using namespace std;

int dfn[10005],low[10005],instack[10005],vis[10005],p[10005];
struct node
{
    int num,next;
}tree[100005];
int i,j,n,m,x,y,index,l,flag,num;
deque<int> s;
void tarjan(int u)
{
    dfn[u]=low[u]=++index;
    vis[u]=1;
    instack[u]=1;
    s.push_back(u);
    for(int i=p[u];i!=-1;i=tree[i].next)
    {
        if (!vis[tree[i].num])
         {
             tarjan(tree[i].num);
             if (flag) return;
             low[u]=min(low[u],low[tree[i].num]);
         } else
         if (instack[tree[i].num])
         {
             low[u]=min(low[u],dfn[tree[i].num]);
         }
    }
     if (dfn[u]==low[u])
         {
           num=0;
           int v;
           do
           {
               v=s.back();
               s.pop_back();
               instack[v]=0;
               num++;
           }
           while(u!=v);
            flag=1;
            return;
         }
    return;
}
int main()
{
    while(scanf("%d%d",&n,&m) && n!=0)
    {
       l=0;
       memset(p,-1,sizeof(p));
        for(i=1;i<=m;i++)
            {
                scanf("%d%d",&x,&y);
                tree[++l].num=y;
                tree[l].next=p[x];
                p[x]=l;
            }
            memset(vis,0,sizeof(vis));
            memset(instack,0,sizeof(instack));
            index=0;
            flag=0;
            s.clear();
            tarjan(x);
            if (n==num) printf("Yes\n");
               else printf("No\n");
    }
    return 0;
}


hdu 1269 迷宫城堡

时间: 2024-11-05 04:47:49

hdu 1269 迷宫城堡的相关文章

hdu 1269 迷宫城堡 (tarjan算法学习)

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7056    Accepted Submission(s): 3137 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

HDU 1269 迷宫城堡(强连通)

HDU 1269 迷宫城堡 题目链接 题意:中文题 思路:强连通模板题 代码: #include <cstdio> #include <cstring> #include <vector> #include <stack> using namespace std; const int N = 10005; int n, m; vector<int> g[N], scc[N]; int pre[N], lowlink[N], sccno[N], d

hdu 1269 迷宫城堡 强连通分量

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12778    Accepted Submission(s): 5698 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

hdu 1269 迷宫城堡 最简单的联通图题 缩点算法

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你

hdu 1269 迷宫城堡(Targin算法)

---恢复内容开始--- 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Swwubmission(s): 10884    Accepted Submission(s): 4878 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单

[ACM] HDU 1269 迷宫城堡(Tarjan算法求强联通分量)

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8099    Accepted Submission(s): 3623 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

HDU 1269 -- 迷宫城堡【有向图求SCC的数目 &amp;amp;&amp;amp; 模板】

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9893    Accepted Submission(s): 4433 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每一个通道都是单向的,就是说若称某通道连通了

HDU 1269 -- 迷宫城堡【有向图求SCC的数目 &amp;&amp; 模板】

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9893    Accepted Submission(s): 4433 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

HDU - 1269 - 迷宫城堡 (tarjan求强连通分量)

题目传送:迷宫城堡 思路:就是tarjan啦,不过korasaju肯定也行啦,这里注意可能本身就不是连通图 AC代码: #include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <cctype> #include <