在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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 else 93 printf("no\n"); 94 } 95 96 }
|
请发表评论