博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【loj3057】【hnoi2019】校园旅行
阅读量:4514 次
发布时间:2019-06-08

本文共 2080 字,大约阅读时间需要 6 分钟。

题目

一个n个点m条边的无向图,每个点有0 / 1 的标号;

有q个询问,每次询问(u,v)直接是否存在回文路径(可以经过重复的点和边);

$1 \le n \le 5 \times 10^3  ,  1 \le m \le 5 \times 10^5  ,   1 \le q \le 10^5 $

题解

  • Part 1

    • n较小,直接预处理所有点对的答案,\(f_{u,v}\)表示 \(u\)\(v\) 是否有 回文路径;
    • 初始化所有点和所有同色边,枚举转移到的点\(u’\)\(v’\) ,时间复杂度:\(O(m^2)\) ;
  • Part 2

    • 暴力算法没有很好的利用01的性质;
    • 可以发现每次的扩展是对称的,将边分成同色边和异色边;
    • 对于异色边形成的连通块,一定是二分图,在二分图中两个点中间路径的奇偶性一定是确定的。图连通,扩展时奇偶性也不会改变,同时直接来回走一条边形成的字符是一样的,所以只需要保留二分图的一个生成树即可;
    • 对于同色边形成的连通块,如果是二分图同理,否则一定可以走到奇环上去交换奇偶性,那么先做一个生成树,再随便在某个点上加入一个奇环代替也是一样的;
    • 时间复杂度:\(O(n^2)\) ;
    #include
    #define mk make_pair#define fi first #define se second #define pb push_backusing namespace std;const int N=5010;int n,m,Q,o,hd[N],fg,col[N],head=1,tail,f[N][N];typedef pair
    pii;pii q[N*N];vector
    g[N]; char s[N];struct Edge{int v,nt;}E[N<<2];void adde(int u,int v){ E[o]=(Edge){v,hd[u]};hd[u]=o++; E[o]=(Edge){u,hd[v]};hd[v]=o++;}void dfs(int u,int typ){ for(int i=0;i<(int)g[u].size();++i){ int v=g[u][i]; if((s[u]^s[v])!=typ)continue; if(!~col[v]){col[v]=col[u]^1;adde(u,v);dfs(v,typ);} else if(col[u]==col[v])fg=1; }}int main(){ freopen("tour.in","r",stdin); freopen("tour.out","w",stdout); scanf("%d%d%d%s",&n,&m,&Q,s+1); for(int i=1;i<=n;++i)hd[i]=-1,q[++tail]=mk(i,i),f[i][i]=1; for(int i=1;i<=m;++i){ int u,v;scanf("%d%d",&u,&v); g[u].pb(v),g[v].pb(u); if(s[u]^s[v])continue; f[u][v]=f[v][u]=1; q[++tail]=mk(u,v); } for(int I=0;I<2;++I){ for(int i=1;i<=n;++i)col[i]=-1; for(int i=1;i<=n;++i)if(!~col[i]){ fg=col[i]=0;dfs(i,I); if(fg)adde(i,i); } } while(head<=tail){ int u=q[head].fi,v=q[head].se;head++; for(int i=hd[u];~i;i=E[i].nt) for(int j=hd[v];~j;j=E[j].nt){ int u1=E[i].v,v1=E[j].v; if(s[u1]!=s[v1]||f[u1][v1])continue; q[++tail]=mk(u1,v1); f[u1][v1]=f[v1][u1]=1; } } for(int i=1;i<=Q;++i){ int u,v;scanf("%d%d",&u,&v); puts(f[u][v]?"YES":"NO"); } return 0;}

转载于:https://www.cnblogs.com/Paul-Guderian/p/10780691.html

你可能感兴趣的文章
标准差(standard deviation)和标准误差(standard error)你能解释清楚吗?
查看>>
南阳oj 题目722 数独
查看>>
小米平板6.0以上系统如何不用Root激活Xposed框架的步骤
查看>>
Elliptical Arcs with SVG
查看>>
做好微博营销的技巧与步骤
查看>>
Docker从入门到实战(二)
查看>>
自定义相机
查看>>
Oracle 体系结构2 - 实例和数据库
查看>>
关于Unity中Vector2和Vector3的使用
查看>>
类与方法
查看>>
Python学习笔记(九) map、zip和filter函数
查看>>
吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-plus-sign...
查看>>
吴裕雄--天生自然 JAVASCRIPT开发学习:比较 和 逻辑运算符
查看>>
html 存放PDF文档
查看>>
setTimeout 传参
查看>>
PC客户端开发细节记录:保存GUID到VARIANT
查看>>
day5感想
查看>>
给DEDE织梦CMS添加搜索结果页显示自定义字段
查看>>
第二章 第五节 获取帮助
查看>>
分布式监控系统Zabbix-3.0.3-完整安装记录(0)
查看>>