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,更好排查,出错的时候更容易理清主体思路,思路永远优先于码速。

最新文章

  1. SQL Server Reporting Service(SSRS) 第四篇 SSRS 用法总结
  2. Xrm.Utility.openEntityForm 时404.15 maxQueryString 错误 和 长度超过maxQueryStringLength值 错误
  3. html5和css3的常用参考网
  4. MVC——应用Ajax获取不到数据问题解答
  5. SPOJ #442 Searching the Graph
  6. SQL入门
  7. [置顶] VS自带工具:dumpbin的使用
  8. ResScope (软件资源分析)V1.94 绿色版
  9. linux 编译c程序与动态链接库
  10. Java集合之Hashtable
  11. 如何在python脚本开发做code review
  12. Mysql的多种安装方法———rpm安装
  13. Mat取行或列
  14. web.config中的InProc模式 与 StateServer模式[转]
  15. python3+selenium 牛刀小试
  16. 2016-2017-2 20155309 南皓芯《java程序设计》第八周学习总结
  17. http://angular.github.io/router/
  18. C++中stringstream样例
  19. php7不支持curl
  20. Javascript中prototype属性详解 (存)

热门文章

  1. RocketMQ - 消费者消费方式
  2. 仿 MVC 三大特性
  3. 自己动手从零写桌面操作系统GrapeOS系列教程——8.x86介绍
  4. git 的基础使用
  5. MSB/LSB的意思
  6. CLIP 改进工作串讲(下)学习笔记
  7. JDBC:实现Java与数据库的连接
  8. python发送钉钉消息通用脚本
  9. vue3 使用clodop打印插件实现不预览直接打印
  10. Win10系统将bat文件注册成服务