• hdu 6165


    题意:n,m,n个点,m条边,问对于任意2个位置,是否可以从一个点到达另一个点

    思路:缩点后,预处理出,每一个联通块能到达的联通块。

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 #pragma comment(linker, "/STACK:102400000,102400000")
      4 const int N=40003;
      5 const int M=40003;
      6 
      7 struct node
      8 {
      9     int from,to,next;
     10 } e[M];
     11 int head[N],tot;
     12 int dfn[N],low[N],belong[N];
     13 int instack[N];
     14 int Stack[N],index1,top,bcnt;
     15 
     16 void add(int u,int v)
     17 {
     18     e[tot].from=u;
     19     e[tot].to=v;
     20     e[tot].next=head[u];
     21     head[u]=tot++;
     22 }
     23 vector<int > g[N];
     24 int go[2000][2000];
     25 int n,m;
     26 void init()
     27 {
     28     tot=1;
     29     memset(go,0,sizeof(go));
     30     memset(dfn,0,sizeof(dfn));
     31     memset(belong,0,sizeof(belong));
     32     memset(head,-1,sizeof(head));
     33     index1=top=bcnt=0;
     34 }
     35 
     36 void tarjan(int u)
     37 {
     38     dfn[u]=low[u]=++index1;
     39     instack[u]=1;
     40     Stack[++top]=u;
     41     for(int i=head[u]; i!=-1; i=e[i].next)
     42     {
     43         int v=e[i].to;
     44         if(!dfn[v])
     45         {
     46             tarjan(v);
     47             low[u]=min(low[u],low[v]);
     48         }
     49         else if(instack[v])
     50         {
     51             low[u]=min(low[u],dfn[v]);
     52         }
     53     }
     54     int v;
     55     if(dfn[u]==low[u])
     56     {
     57         bcnt++;
     58         do
     59         {
     60             v=Stack[top--];
     61             instack[v]=0;
     62             belong[v]=bcnt;
     63         }
     64         while(u!=v);
     65     }
     66 }
     67 
     68 void dfs(int u,int zu) {
     69     for(int i=0;i<g[u].size();i++){
     70         int v=g[u][i];
     71         go[zu][v]=1;
     72         //cout<<u<<" "<<v<<endl;
     73         dfs(v,zu);
     74     }
     75 }
     76 
     77 int main()
     78 {
     79     int t;
     80     cin>>t;
     81     while(t--)
     82     {
     83         int x,y;
     84         init();
     85         scanf("%d%d",&n,&m);
     86         for(int i=1; i<=m; i++)
     87         {
     88             scanf("%d%d",&x,&y);
     89             add(x,y);
     90         }
     91         for(int i=1; i<=n; i++)
     92             if(!dfn[i]) tarjan(i);
     93         for(int i=1; i<=bcnt; i++) g[i].clear();
     94         for(int i=1; i<=m; i++)
     95         {
     96             if(belong[e[i].from]!=belong[e[i].to])
     97             {
     98                 g[belong[e[i].from]].push_back(belong[e[i].to]);
     99             }
    100         }
    101         for(int i=1; i<=bcnt; i++)
    102         {
    103             dfs(i,i);
    104         }
    105         int tt=0;
    106 
    107         for(int i=1; i<=n; i++)
    108         {
    109             for(int j=i+1; j<=n; j++)
    110             {
    111                 //cout<<i<<" "<<j<<endl;
    112                 if(belong[i]==belong[j]) continue;
    113                 int xx=belong[i],yy=belong[j];
    114                 if(!go[xx][yy]&&!go[yy][xx])
    115                 {
    116                    
    117                     tt=1;
    118                     break;
    119                 }
    120             }
    121             if(tt) break;
    122         }
    123         if(tt) printf("Light my fire!
    ");
    124         else printf("I love you my love and our love save us!
    ");
    125     }
    126     return 0;
    127 }
  • 相关阅读:
    Dynamics CRM
    Cordova
    《linux就该这么学》第二节课,安装红帽7,基础命令至2.3小节的笔记
    《linux就该这么学》开课,linux之路新开始
    《linux就该这么学》找到一本不错的Linux电子书,《Linux就该这么学》。
    mongodb3.4.5用http访问28017端口
    mongodb安装步骤
    linux安装docker
    centos 遇到/dev/mapper/cl-root 100% 解决方法
    本机ping不通虚拟机,但虚拟机可以ping通本机
  • 原文地址:https://www.cnblogs.com/hhxj/p/7413422.html
Copyright © 2020-2023  润新知