HDU 1824
好吧,这次估计是明白边的含义了。
X\/Y= -X->Y = -Y->X 这就达成了选了-X必须选Y的目的了。对于这道题,必须要明白题目了。
每一个队(三人一队)或者队长留下或者其余两名队员同时留下 : 就可以得到 X\/(Y^Z)=1 而不是互斥的。
以及 X->-Y -X->Y
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 using namespace std; 7 8 const int MAXN=10010; 9 const int MAXM=100100; 10 11 int head[MAXN],dfn[MAXN],low[MAXN],st[MAXN],stop,belong[MAXN],tot,index,pat; 12 bool stack[MAXN]; 13 struct { 14 int u,v; 15 int next; 16 }edge[MAXM]; 17 int n,m; 18 19 void init(){ 20 stop=0; tot=0; index=0; pat=-1; 21 for(int i=0;i<6*n;i++){ 22 head[i]=-1; 23 dfn[i]=low[i]=0; 24 belong[i]=-1; 25 stack[i]=false; 26 } 27 } 28 29 void addedge(int u,int v){ 30 edge[tot].u=u; 31 edge[tot].v=v; 32 edge[tot].next=head[u]; 33 head[u]=tot++; 34 } 35 36 void tarjan(int u){ 37 int v; 38 dfn[u]=low[u]=++index; 39 st[stop++]=u; stack[u]=true; 40 for(int e=head[u];e!=-1;e=edge[e].next){ 41 v=edge[e].v; 42 if(dfn[v]==0){ 43 tarjan(v); 44 low[u]=min(low[u],low[v]); 45 } 46 else if(stack[v]){ 47 low[u]=min(low[u],dfn[v]); 48 } 49 } 50 if(dfn[u]==low[u]){ 51 pat++; 52 do{ 53 v=st[--stop]; 54 stack[v]=false; 55 belong[v]=pat; 56 }while(u!=v); 57 } 58 } 59 60 int main(){ 61 int u,v; 62 int a,b,c; 63 while(scanf("%d%d",&n,&m)!=EOF){ 64 init(); 65 for(int i=1;i<=n;i++){ 66 scanf("%d%d%d",&a,&b,&c); 67 addedge(a*2+1,b*2); 68 addedge(a*2+1,c*2); 69 addedge(c*2+1,a*2); 70 addedge(b*2+1,a*2); 71 } 72 for(int i=1;i<=m;i++){ 73 scanf("%d%d",&u,&v); 74 addedge(u*2,v*2+1); 75 addedge(v*2,u*2+1); 76 } 77 for(int i=0;i<6*n;i++){ 78 if(dfn[i]==0) 79 tarjan(i); 80 } 81 bool flag=true; 82 for(int i=0;i<3*n;i++){ 83 if(belong[i*2]==belong[i*2+1]){ 84 printf("no\n"); 85 flag=false; 86 break; 87 } 88 } 89 if(flag) 90 printf("yes\n"); 91 } 92 }