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!\n");
124         else printf("I love you my love and our love save us!\n");
125     }
126     return 0;
127 }

 

posted on 2017-08-22 20:04  hhhhx  阅读(143)  评论(0编辑  收藏  举报

导航