標籤:style blog http color os io for ar art
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\n");92 else93 printf("no\n");94 }95 96 }
View Code
Let's go home