• E 定向 牛客练习赛25


    tarjan

    父节点和子节点

      1 #include <cstdio>
      2 #include <cstdlib>
      3 #include <cmath>
      4 #include <cstring>
      5 #include <time.h>
      6 #include <string>
      7 #include <set>
      8 #include <map>
      9 #include <list>
     10 #include <stack>
     11 #include <queue>
     12 #include <vector>
     13 #include <bitset>
     14 #include <ext/rope>
     15 #include <algorithm>
     16 #include <iostream>
     17 using namespace std;
     18 #define ll long long
     19 #define minv 1e-6
     20 #define inf 1e9
     21 #define pi 3.1415926536
     22 #define E  2.7182818284
     23 const ll mod=1e9+7;//998244353
     24 const int maxn=1e6+10;
     25 
     26 struct node
     27 {
     28     int d,pos,c;
     29     node* next;
     30 }*e[maxn];
     31 
     32 bool vis[maxn]={0};
     33 int dfn[maxn],low[maxn],num=0,g=0,n,cond[maxn],st[maxn],fa[maxn];
     34 
     35 void dfs(int d)
     36 {
     37     int dd;
     38     node* p=e[d];
     39     dfn[d]=low[d]=++num;
     40     vis[d]=1;
     41     st[++g]=d;
     42     while (p)
     43     {
     44         dd=p->d;
     45         if (!vis[dd])
     46         {
     47             fa[dd]=d;
     48             dfs(dd);
     49             low[d]=min(low[d],low[dd]);
     50             cond[p->pos]=p->c;
     51         }
     52         //lack whether in stack (not necessarily)
     53         else if (fa[d]!=dd)
     54         {
     55             low[d]=min(low[d],dfn[dd]);
     56             if (dfn[d]>dfn[dd])
     57                 cond[p->pos]=p->c;
     58         }
     59         p=p->next;
     60     }
     61     if (dfn[d]==low[d])
     62     {
     63         if (g!=n || st[1]!=d)
     64         {
     65             printf("impossible");
     66             exit(0);
     67         }
     68     }
     69 }
     70 
     71 int main()
     72 {
     73     node* p;
     74     int m,i,x,y;
     75     scanf("%d%d",&n,&m);
     76     for (i=1;i<=m;i++)
     77     {
     78         scanf("%d%d",&x,&y);
     79         p=(node*) malloc (sizeof(node));
     80         p->d=y;
     81         p->pos=i;
     82         p->c=0;
     83         p->next=e[x];
     84         e[x]=p;
     85 
     86         p=(node*) malloc (sizeof(node));
     87         p->d=x;
     88         p->pos=i;
     89         p->c=1;
     90         p->next=e[y];
     91         e[y]=p;
     92     }
     93     fa[1]=0;
     94     dfs(1);
     95     for (i=1;i<=m;i++)
     96         printf("%d",cond[i]);
     97     return 0;
     98 }
     99 /*
    100 3 2
    101 1 2
    102 2 3
    103 */
  • 相关阅读:
    史上最刁钻的十道英语面试题
    99%的人连Where are you from都不会回答?
    库存管理与订单的控制
    订单处理逻辑
    配送规划
    多商家电子商务解决方案
    电商库存规划
    库存管理从入门到精通
    商家报名系统
    经销商管理
  • 原文地址:https://www.cnblogs.com/cmyg/p/9532517.html
Copyright © 2020-2023  润新知