题意:

给定一幅图, 问符不符合一下两个条件;

(1) 图中没有环

(2)图中存在一条链, 点要么在链上, 要么是链上点的邻居。

分析:

建图,记录度数, 去掉所有度为1的点, 然后看看剩下是否是有2个度为1的点和其他都是度为2的点。

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
#include<cmath>
#define rep(i,a,b) for(int i = a; i < b; i++)
#define _rep(i,a,b) for(int i = a; i <= b; i++)
using namespace std;
int G[][];
int n, m;
int deg[], vis[];
int main(){
// freopen("1.txt","r", stdin);
int kase = ;
while(~scanf("%d", &n) && n){
memset(G,,sizeof(G));
memset(deg,,sizeof(deg));
memset(vis,,sizeof(vis));
scanf("%d", &m);
for(int i = ; i < m ; i++){
int u, v;
scanf("%d %d", &u, &v);
G[u][v] = G[v][u] = ;
deg[u]++;
deg[v]++;
}
for(int i = ; i <= n; i++){
if(deg[i] == ){ //把度为1的点全部删除, 把链上的分叉的消去
vis[i] = ;
for(int j = ; j <= n; j++){
if(G[i][j])
deg[j]--;
}
}
}
int ok = , _1 = , _2 = ,cnt = ;
for(int i = ;i <= n; i++){
if(!vis[i]){
cnt++;
if(deg[i] == ) _1++;//统计剩下点度为1的
else if(deg[i] == ) _2++;//统计剩下度为2的
}
}
if(!(_1 == && _2 == (cnt-))) ok = ;//如果有2个度为1, 其他都是2, 那么就是一条链, 其他情况都不符合
if(ok)
printf("Graph %d is a caterpillar.\n",kase++);
else printf("Graph %d is not a caterpillar.\n",kase++);
}
return ;
}

最新文章

  1. 在 SharePoint Server 2016 本地环境中设置 OneDrive for Business
  2. 用jquery解析JSON数据的方法以及字符串转换成json的3种方法
  3. 云存储的那些事(2)——数据分布算法CRUSH
  4. ABP框架详解(七)Caching
  5. docker进程管理
  6. LoadRunner测试50人同时登陆下单
  7. Repairing Company(poj 3216)
  8. outlook 用宏发邮件
  9. YARN-RPC
  10. [添加用户]解决useradd 用户后没有添加用户Home目录的情况,Linux改变文件或目录的访问权限命令,linux修改用户密码
  11. Resource temporarily unavailable
  12. LXC-Linux Containers介绍
  13. vmware产品
  14. Hibernate知识点总结
  15. Single Number(JAVA)
  16. CSS3学习----选择器、字体
  17. java 数据格式验证类
  18. 重写toFixed()方法
  19. HBase篇(3)-架构详解
  20. quratz线程

热门文章

  1. $BREEZE&#39;S Diary$
  2. iOS 获取当前响应链的First Responder (Swift)
  3. c++ 语法解析
  4. 1-18String类简介
  5. HDU 1220 B - Cube
  6. 10.JAVA-接口、工厂模式、代理模式、详解
  7. hash系列集合的性能优化
  8. ES-自然语言处理
  9. 【学习笔记】深入理解js原型和闭包(14)——从【自由变量】到【作用域链】
  10. iframe 完全跨域自适应高度