codeforces 1391E Pairs of Pairs dfs树的性质
2024-10-21 10:33:07
https://codeforces.com/problemset/problem/1391/E
题意:给一个无向图,找出以下任意一种输出答案
1,长度>=n/2(上界)的简单路径(没有同一个点走2次的路径)
2,点对树>=n/2(上界)的点对集,使得点对集内部的任意两个点对的4个点,边数不超过2
解法:
根据dfs树的性质,每个点x的出边只有树边和返祖边两种,返祖边只会连到x的祖先节点,所以任意一个节点的两颗子树没有横向边。
这个题先从某个点导出一颗dfs树,如果深度>=n/2(上界),直接输出路径即可。
否则,直接让同深度的点配对即可,深度低于n/2(上界),树必然宽,横向同深度的点对配对后加起来总点对树一定>=n/2(上界)。
#include<bits/stdc++.h> using namespace std; typedef long long ll;
const int maxn=500100;
const int INF=(1<<29); int n,m;
int u,v;
vector<int> G[maxn];
vector<int> T[maxn];
vector<int> node[maxn];
int dep[maxn];
int max_dep[maxn];
vector<int> path;
vector<pair<int,int> > prs;
bool vis[maxn]; void init(){
for(int i=0;i<=n;i++) G[i].clear(),node[i].clear(),dep[i]=0,vis[i]=0,max_dep[i]=0,T[i].clear();
path.clear();prs.clear();
} void input(){
for(int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
} void dfs(int u,int f){
if(vis[u]) return;
vis[u]=1;
if(u!=1) T[f].push_back(u);
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==f) continue;
dfs(v,u);
}
} void go(int u){
path.push_back(u);
int next=u;
for(int i=0;i<T[u].size();i++){
int v=T[u][i];
if(max_dep[v]>=max_dep[next]) next=v;
}
if(next==u) return;
go(next);
} void get_d(int u,int f,int d){
dep[u]=d;
max_dep[u]=d;
node[d].push_back(u);
for(int i=0;i<T[u].size();i++){
int v=T[u][i];
get_d(v,u,d+1);
max_dep[u]=max(max_dep[u],max_dep[v]);
}
} void solve(){
init();
input();
dfs(1,0);
get_d(1,0,1);
if(max_dep[1]>=(n+1)/2){
go(1);
puts("PATH");
cout<<(int)path.size()<<endl;
for(int i=0;i<path.size();i++) cout<<path[i]<<" ";cout<<endl;
}
else{
for(int i=2;i<=max_dep[1];i++){
if((int)node[i].size()<2) continue;
for(int j=1;j<node[i].size();j+=2) prs.push_back(make_pair(node[i][j-1],node[i][j]));
}
puts("PAIRING");
cout<<(int)prs.size()<<endl;
for(int i=0;i<prs.size();i++) cout<<prs[i].first<<" "<<prs[i].second<<endl;
}
} int main(){
// freopen("in.txt","r",stdin);
int T;cin>>T;
while(~scanf("%d%d",&n,&m)) solve();
return 0;
}
另一点就是把长程序分解分模块写,可以减少bug,更好排查,出错的时候更容易理清主体思路,思路永远优先于码速。
最新文章
- SQL Server Reporting Service(SSRS) 第四篇 SSRS 用法总结
- Xrm.Utility.openEntityForm 时404.15 maxQueryString 错误 和 长度超过maxQueryStringLength值 错误
- html5和css3的常用参考网
- MVC——应用Ajax获取不到数据问题解答
- SPOJ #442 Searching the Graph
- SQL入门
- [置顶] VS自带工具:dumpbin的使用
- ResScope (软件资源分析)V1.94 绿色版
- linux 编译c程序与动态链接库
- Java集合之Hashtable
- 如何在python脚本开发做code review
- Mysql的多种安装方法———rpm安装
- Mat取行或列
- web.config中的InProc模式 与 StateServer模式[转]
- python3+selenium 牛刀小试
- 2016-2017-2 20155309 南皓芯《java程序设计》第八周学习总结
- http://angular.github.io/router/
- C++中stringstream样例
- php7不支持curl
- Javascript中prototype属性详解 (存)