北大acm 3710

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
else ring(x,ver[i]);//x-fa[x]-fa[fa[x]]-……-ver[i]构成一个环 } } int SG(int x) { c[x]=1; int temp=0;
for(int i=head[x];i;i=next[i])//SG值为子节点SG值+1的异或 if (!c[ver[i]]) temp^=(SG(ver[i])+1); return temp; } int main() { while(cin>>t) { ans=0;
void ring(int x,int r)//把偶环缩成点,奇环缩成点+边 { int j=1;
for(int i=x;i!=r;i=fa[i]) {c[i]=1; j++;}//缩点后的点标记为1
if (j&1) c[r]=2;//奇环顶点标记为2 } void dfs(int x) { for(int i=head[x];i;i=next[i]) {
fa[1]=1;//注意根节点的父亲标记为自己,否则对于根节点在环里的数据会WA dfs(1);
for(i=1;i<=n;i++)//奇环缩成一个点+一条边 if (c[i]==2) {add(i,++n); c[i]=0;} ans^=SG(1); } if (ans) cout<<"Sally\n";else cout<<"Harry\n"; } return 0; }
北大acm
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int ver[2000],head[200]wenku.baidu.comnext[2000],fa[200],c[200]; int t,n,m,i,j,x,y,tot,ans; void add(int x,int y) { ver[++tot]=y; next[tot]=head[x]; head[x]=tot; }
while(t--) { scanf("%d%d",&n,&m); memset(head,0,sizeof(head)); memset(c,0,sizeof(c)); memset(fa,0,sizeof(fa)); tot=0; for(i=0;i<m;i++) {
scanf("%d%d",&x,&y); add(x,y); add(y,x); }
if ((ver[i]==fa[x])||(c[ver[i]])) continue;//指向父亲,或者指向已
经缩点的点
else if (fa[ver[i]]==x) ring(ver[i],x);//用于特殊处理两个点构成的
环(重边)
else if (!fa[ver[i]]) {fa[ver[i]]=x; dfs(ver[i]);}//未访问过
相关文档
最新文档