zoukankan      html  css  js  c++  java
  • Let's go home

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

    题意:中文题。

    题解:这一题建边要考虑两个限制条件,一个是队伍内部的,就是假如说 a,b,c,的话 a-->~b,b-->~a;a-->~c,c-->~a;同时b,c要留时候必须同时留下所以b-->c,c-->b;~b-->~c,~c-->~b;就是b留c需要留,c留b需要留,b不留c不要留,c不留留b不需要留,;;,然后是每一对的情况,直接建边就可以了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 int t,m,n;
     7 const int N=200010;
     8 const int M=400010;
     9 const int INF=0xffffffff;
    10 struct Edge{
    11     int to,next;
    12 } edge[M];
    13 int  cnt,u,v,dep,top,atype;
    14 int  dfn[N],low[N],vis[N],head[N],st[N],belong[N],in[N],out[N],sum[N];
    15 //sum[i]记录第i个连通图的点的个数,in[i],out[i],表示缩点之后点的入度和初度。
    16 void init(){
    17       cnt=dep=top=atype=0;
    18     memset(head,-1,sizeof(head));
    19     memset(dfn,0,sizeof(dfn));
    20     memset(low,0,sizeof(low));
    21     memset(vis,0,sizeof(vis));
    22     memset(belong,0,sizeof(belong));
    23     memset(in,0,sizeof(in));
    24     memset(out,0,sizeof(out));
    25     memset(sum,0,sizeof(sum));
    26 }
    27 void addedge(int u,int v){
    28     edge[cnt].to=v;
    29     edge[cnt].next=head[u];
    30     head[u]=cnt++;
    31 }
    32 
    33 void Tarjan(int u){
    34     dfn[u]=low[u]=++dep;
    35     st[top++]=u;
    36     vis[u]=1;
    37     for(int i=head[u]; i!=-1; i=edge[i].next){
    38         int v=edge[i].to;
    39         if(!dfn[v]){
    40             Tarjan(v);
    41             low[u]=min(low[u],low[v]);
    42         }
    43         else if(vis[v]){
    44             low[u]=min(low[u],dfn[v]);
    45         }
    46     }
    47     int j;
    48     if(dfn[u]==low[u]){
    49         atype++;
    50         do{
    51             j=st[--top];
    52             belong[j]=atype;
    53             sum[atype]++;   //记录每个连通分量中点的个数
    54             vis[j]=0;
    55         }
    56         while(u!=j);
    57     }
    58 }
    59 int fg[N],t1,t2,t3;
    60 int main(){
    61    while(~scanf("%d%d",&t,&m)){
    62       int a,b,c;
    63     int base=3*t;
    64     init();
    65     for(int i=0;i<t;i++){
    66         scanf("%d%d%d",&a,&b,&c);
    67          addedge(b,c);
    68          addedge(c,b);
    69          addedge(b+base,c+base);
    70          addedge(c+base,b+base);
    71          addedge(a+base,b);
    72          addedge(a+base,c);
    73          addedge(b+base,a);
    74          addedge(c+base,a);
    75     }
    76     while(m--){
    77         scanf("%d%d",&a,&b);
    78          addedge(a,b+base);
    79          addedge(b,a+base);
    80     }
    81       for(int i=0; i<6*t; i++)
    82         if(!dfn[i])
    83             Tarjan(i);
    84        bool flag=false;
    85        for(int i=1;i<3*t;i++){
    86          if(belong[i]==belong[i+base]){
    87             flag=true;
    88            break;
    89          }
    90        }
    91        if(!flag)printf("yes
    ");
    92        else
    93         printf("no
    ");
    94    }
    95 
    96 }
    View Code
  • 相关阅读:
    九度OJ 1010 A+B
    九度OJ 1052 找x
    oracle数据库创建备份与恢复 脚本
    在select标签中添加a标签
    如何在select标签中使用a标签跳转页面
    网站访问不了
    js实现input的赋值
    PHP如何实现百万级数据导出
    互联网产品需求管理杂思2需求收集,互联网营销 狼人:
    做网站用UTF8还是GB2312?,互联网营销 狼人:
  • 原文地址:https://www.cnblogs.com/chujian123/p/3930787.html
Copyright © 2011-2022 走看看