首页 > 代码库 > HDU 1824
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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。