• HDU 5154 Harry and Magical Computer 有向图判环


    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=5154

    题解:

    有向图判环。

    1、用dfs,正在访问的节点标记为-1,已经访问过的节点标记为1,没有访问过的节点标记为0,如果访问到-1的节点说明说有环。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 using namespace std;
     6 typedef long long LL;
     7 
     8 int n,m; 
     9 
    10 const int maxm=10000+10;
    11 const int maxn=111;
    12 
    13 struct Edge{
    14     int v,ne;
    15     Edge(int v,int ne):v(v),ne(ne){}
    16     Edge(){}
    17 }egs[maxm];
    18 
    19 int head[maxn],tot;
    20 int vis[maxn];
    21 
    22 void addEdge(int u,int v){
    23     egs[tot]=Edge(v,head[u]);
    24     head[u]=tot++; 
    25 }
    26 
    27 bool dfs(int cur){
    28     vis[cur]=-1;
    29     int p=head[cur];
    30     while(p!=-1){
    31         Edge &e=egs[p];
    32         if(vis[e.v]==0){
    33             if(dfs(e.v)) return true;
    34         }
    35         else if(vis[e.v]==-1){
    36             return true;
    37         } 
    38         p=e.ne;
    39     }
    40     vis[cur]=1;
    41     return false;
    42 }
    43 
    44 void init(){
    45     memset(head,-1,sizeof(head));
    46     memset(vis,0,sizeof(vis));
    47     tot=0;
    48 }
    49 
    50 int main(){
    51     while(scanf("%d%d",&n,&m)==2&&n){
    52         init();
    53         while(m--){
    54             int u,v;
    55             scanf("%d%d",&u,&v);
    56             addEdge(u,v);
    57         } 
    58         int su=1;
    59         for(int i=1;i<=n;i++){
    60             if(vis[i]==0){
    61                 if(dfs(i)){
    62                     su=0; break;
    63                 }
    64             } 
    65         }
    66         if(su) puts("YES");
    67         else puts("NO"); 
    68     }
    69     return 0;
    70 }

    2、拓扑排序。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<queue>
     6 using namespace std;
     7 typedef long long LL;
     8 
     9 int n, m;
    10 
    11 const int maxm = 10000 + 10;
    12 const int maxn = 111;
    13 
    14 struct Edge {
    15     int v, ne;
    16     Edge(int v, int ne) :v(v), ne(ne) {}
    17     Edge() {}
    18 }egs[maxm];
    19 
    20 int head[maxn], tot;
    21 int ind[maxn];
    22 
    23 void addEdge(int u, int v) {
    24     egs[tot] = Edge(v, head[u]);
    25     head[u] = tot++;
    26 }
    27 
    28 void init() {
    29     memset(head, -1, sizeof(head));
    30     memset(ind, 0, sizeof(ind));
    31     tot = 0;
    32 }
    33 
    34 int main() {
    35     while (scanf("%d%d", &n, &m) == 2 && n) {
    36         init();
    37         while (m--) {
    38             int u, v;
    39             scanf("%d%d", &u, &v);
    40             addEdge(u, v);
    41             ind[v]++;
    42         }
    43         queue<int> q;
    44         for (int i = 1; i <= n; i++) {
    45             if (ind[i] == 0) q.push(i);
    46         }
    47         while (!q.empty()) {
    48             int u = q.front(); q.pop();
    49             //printf("v:%d
    ", v);
    50             int p = head[u];
    51             while (p != -1) {
    52                 Edge& e = egs[p];
    53                 ind[e.v]--;
    54                 if (ind[e.v] == 0) q.push(e.v);
    55                 p = e.ne;
    56             }
    57         }
    58         int su = 1;
    59         for (int i = 1; i <= n; i++) {
    60             if (ind[i]) { su = 0; break; }
    61         }
    62         if (su) puts("YES");
    63         else puts("NO");
    64     }
    65     return 0;
    66 }
  • 相关阅读:
    谷歌开源计划
    windows XP/vista/win 7 开机登录密码破解大全
    QQ好友空间加密没有密码但我们又很想看怎么办?(QQ空间瞬间破解+相册破解)
    VMware Workstation 7.1.4385536官方正式版+完美汉化包+注册码
    win7/xp笔记本建立wifi热点 用手机连接上网
    Cisco路由器OSPF协议经典学习笔记
    宽带连接错误的处理办法691、623、678、645、720、721、718、734、769、619、676、815
    CCNA的综合实验2
    交换机故障的一般分类和排障步骤
    cisco_iso命名规则
  • 原文地址:https://www.cnblogs.com/fenice/p/5447782.html
Copyright © 2020-2023  润新知