BZOJ3092 : [FDU2012校赛] A Famous King’s Trip

题目等价于去掉两条边,使得剩下的图连通,且所有点度数都为偶数。

首先特判掉图一开始就不连通的情况。

求出dfs生成树,对于每条非树边随机一个权值,每条树边的权值为所有经过它的非树边权值的异或和。

那么剩下的图连通等价于两条边权值非$0$,且两条边的权值不等。

如果有$2$个奇点,那么两条边有公共点,枚举公共点判断即可。

否则只能是$4$个奇点,分类讨论判断所有连边方式即可。

时间复杂度$O(n+m)$。

#include<cstdio>
#define N 200010
int Case,n,m,i,x,y,g[N],v[N<<1],nxt[N<<1],ed,d[N],vis[N],dfn,f[N],q[N],cnt,ansx,ansy;
unsigned long long seed,h[N],tag[N];
inline void read(int&a){char c;while(!(((c=getchar())>=‘0‘)&&(c<=‘9‘)));a=c-‘0‘;while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;}
inline void add(int x,int y){d[x]^=1;v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
void dfs(int x,int y){
  vis[x]=++dfn;
  for(int i=g[x];i;i=nxt[i]){
    int u=v[i];
    if(u==y)continue;
    if(!vis[u])f[u]=i>>1,dfs(u,x);
    else if(vis[u]<vis[x]){
      h[i>>1]=seed=seed*233+17;
      tag[x]^=seed,tag[u]^=seed;
    }
  }
}
void dfs2(int x,int y){
  vis[x]=++dfn;
  for(int i=g[x];i;i=nxt[i]){
    int u=v[i];
    if(u==y)continue;
    if(!vis[u])dfs2(u,x),tag[x]^=tag[u];
  }
  if(x>1)h[f[x]]^=tag[x];
}
inline int get(int x,int y){
  for(int i=g[x];i;i=nxt[i])if(v[i]==y)return i>>1;
  return 0;
}
inline void up(int x,int y){
  if(!x||!y)return;
  if(!h[x]||!h[y]||h[x]==h[y])return;
  if(x>y){int z=x;x=y;y=z;}
  if(x<ansx)ansx=x,ansy=y;else if(x==ansx&&y<ansy)ansy=y;
}
bool solve(){
  dfn=cnt=seed=0;
  for(i=1;i<=n;i++)g[i]=d[i]=vis[i]=f[i]=tag[i]=0;
  for(i=1;i<=m;i++)h[i]=0;
  for(ed=i=1;i<=m;i++)read(x),read(y),add(x,y),add(y,x);
  for(i=1;i<=n;i++)if(d[i])q[++cnt]=i;
  if(cnt!=2&&cnt!=4)return 0;
  dfs(1,0);
  for(i=1;i<=n;i++)if(!vis[i])return 0;
  for(dfn=0,i=1;i<=n;i++)vis[i]=0;
  dfs2(1,0);
  ansx=N;
  if(cnt==4){
    up(get(q[1],q[2]),get(q[3],q[4]));
    up(get(q[1],q[3]),get(q[2],q[4]));
    up(get(q[1],q[4]),get(q[2],q[3]));
  }else for(i=1;i<=n;i++)if(!d[i])up(get(i,q[1]),get(i,q[2]));
  if(ansx<N)return printf("YES\n%d %d\n",ansx,ansy),1;
  return 0;
}
int main(){
  while(~scanf("%d%d",&n,&m)){
    printf("Case %d: ",++Case);
    if(!solve())puts("NO");
  }
  return 0;
}

  

时间: 2024-10-05 15:31:18

BZOJ3092 : [FDU2012校赛] A Famous King’s Trip的相关文章

BZOJ 3093: [Fdu校赛2012] A Famous Game

3093: [Fdu校赛2012] A Famous Game Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 242  Solved: 129[Submit][Status][Discuss] Description Mr. B and Mr. M like to play with balls. They have many balls colored in blue and red. Firstly, Mr. B randomly picks

CSU 1425 NUDT校赛 I题 Prime Summation

这个题本来有希望在比赛里面出了的 当时也想着用递推 因为后面的数明显是由前面的推过来的 但是在计算的时候 因为判重的问题 ...很无语.我打算用一个tot[i]来存i的总种树,tot[i]+=tot[j]//j为可以由j推到i的一系列数,但这样是不对的,会产生大量重复计算... 看了下标程才发现要用二维来计算出种类总数,f[i][j]+=sum(f[i-j][k]) 表示在推i数的时候,第一个素数为j的种类数,注意j一定为素数,而且k不能大于j...标程里面处理的比较简练,就学了下他的写法. 至

校赛总结

写写校赛总结....... 这两次校赛是我们组队以后第一次的比赛...第一场打得很拙,第二场还可以吧,第一场校赛--毕竟是期待了很久的校赛,所以感觉还是很紧张,吃饭的时候打了二两,剩了一大半==, 这次我们队名叫 I_Love_High_Math......没走到现场,就快下雨了,真的有点郁闷==.到了以后下雨了,和一个队友被困雨中,,出来以后衣服湿了,一开始就悲剧了...     然后一开场就感觉不好.比赛开始的时候,我去写头文件,然后W说A是水题,然后叫我写,平时都是我写第一题的这次我不想开

NYOJ-682 小媛在努力 (郑大第六届校赛 模拟)

链接:click here 题意: 描述 在多媒体数据处理中,数据压缩算法尤为重要.小媛上完课后就想自己发明一个数据压缩算法.她想呀想,终于想到一个方法.在多媒体数据中有很多数据都是重复的,所以她想把连续相同的数据用数据出现的次数和数据本身表示.例如:1 1 1 2 3 3 3 3 3  压缩后及为3 1 1 2 5 3(表示3个1,1个2和5个3).有想法后小媛就希望把它用代码实现了.但是大家都知道小媛现在整天都忙着苦B的复习考研,连电脑都摸不到.所以她希望作为ACMer的你帮她写一下. 输入

HDU多校赛第9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学小知识】

难度上,,,确实,,,不算难 问题是有个矩阵运算的优化 题目是说给个N*K的矩阵A给个K*N的矩阵B(1<=N<=1000 && 1=<K<=6),先把他们乘起来乘为C矩阵,然后算C^(N*N) 相当于 ABABABABABABAB...=(AB)^(N*N) 不如 A(BA)^(N*N-1)B 因为BA乘得K*K的矩阵,K是比较小的 #include <cstdio> #include <cstdlib> #include <cstr

ZJU校赛 一道计数题

题意是这样的 给定一个n*m的整数矩阵 n和m均小于1000 对这个矩阵删去任意行和列后剩余一个矩阵为M{x1,x2,,,,xm;y1,y2,,,,,yn}表示删除任意的M行N列 对于这个剩下的矩阵,我们考虑其中是否存在特殊的元素,保证这些元素是所在行最大,所在列最小的元素 且非之一. 求对于所有删法,上述元素个数之和 对10^9+7取余. 显然所有删法 有2^(n+m)种 暴力是搞不定的. 于是反过来看,矩阵的元素最多有10^6个 是不是可以考虑每一个元素对最终答案的贡献? 所谓贡献,就是它在

山科第三届校赛总结

这次山科的校赛算是省赛前的一次正式的检验吧,暴露了我们队伍之前训练很多没发现的问题. 比赛的过程真的算是有惊无险,差点就GG... 我们入场晚了一会,我刚读完C题,就发现已经有人过了F题了,我去看F题,是个统计闰年的水题,很快就敲过了.回去想接着看C,感觉也很水,这时cerberux说这个用个map就A了,我让他来敲,可是他好像用的不是很熟练,这道题敲的很慢,交上去还wa了...我回过头仔细看这题,觉得扫一遍统计一次最多连续出现的次数就可以了,这才把这个水题过了.然后我去敲G,G题我出现了很严重

[第十届校赛]简单总结

这次校赛其实是抱着比较大的期望来打的,首先我是单挑,好像自从去年蓝桥杯后就没有一个人做过比赛,一般都是组队做,这次单挑,是想测测自己的水平和对节奏的把握,也有夺冠的冲动,很可惜,整体上是失败了TAT.如果一开始就稳扎稳打,说不定真的可以题数碾压.. 做完胡老师出的三个水题后,交了一发卡精度的二分,节奏就开始乱了.首先我自认为我的思路很正确,并且已经将误差降到很低了,但陆陆续续wa了7发,wa的原因自然是精度问题.大概比赛结束前2个小时,我把精度加大了一位,居然奇迹般的过了,无语..我一直以为比目

2014哈商大ICPC/ACM校赛解题报告

被debug邀请去參加校赛,哎,被虐..我对不起工大.. 由于本人不搞ACM,算法处于HelloWorld水准.. 虽然题目除了鸟不拉屎星人之外都非常水,但我能做到这个程度,全然是超水平发挥了.. 数据:点此下载 ============================================================== a:逆序数组+删除特定元素 题目: 小伙伴们好像非常多没接触过ICPC,那先来一道水题尝尝鲜,给出 一个数组,和一个特征值.将这个数组中特征值值删除后逆序输出.