欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Week2 A - 化学

程序员文章站 2022-07-12 14:58:54
...

模拟题

Gym - 270437A

给你六个节点的一棵树让你求是下图中哪种,输出名字。
Week2 A - 化学

暴力枚举就完事了

找到每个图特殊的地方即可。
思路很简单,只需要记录每个节点的度数和它的邻接点。

从度数入手

  • 四度节点

我们发现有四度节点的只有这个
Week2 A - 化学

  • 三度节点

有三度节点的有三个图,但是这三个邻接点的情况各不相同。判断的方法有很多,我用的是邻接点度数的乘积
①乘积:1 x 1 x 2 = 2Week2 A - 化学
②乘积:2 x 2 x 1 = 4Week2 A - 化学
③乘积:3 x 1 x 1 = 3Week2 A - 化学

  • 两度节点

只剩最后一个了。else就好了
Week2 A - 化学

#include<iostream>
#include<cstring>
#define For(i,a,n) for(register int i=a;i<=n;i++)
using namespace std;

int T,a,b;
struct node{
	int ds;			//度数
	int num_of_nb;	//这里zz了  这东西和度数应该是一样的
	int nb[10];		//neighbors
}A[10];

int main(){
    ios::sync_with_stdio(false);
    cin>>T;
    while(T--){
    	int flag = 0;			//判断是否有输出
    	memset(A,0,sizeof(A));
    	For(i,1,5){
    		cin>>a>>b;
    		A[a].ds++, A[b].ds++;	//a和b节点ds++
    		A[a].nb[++A[a].num_of_nb]=b; //相互成为邻居
    		A[b].nb[++A[b].num_of_nb]=a;
    	}
    	For(i,1,6){
    		if(A[i].ds==4){		//度数为4
    			cout<<"2,2-dimethylbutane"<<endl;
    			flag = 1;
    			break;
    		}
    		if(A[i].ds==3){		//度数为3
    			int temp=1;		//记录邻接点度数乘积
    			For(j,1,3){
    				int nb = A[i].nb[j];
    				int nbds = A[nb].ds;
    				temp*=nbds;
    			}
    			if(temp==2)		//乘积为2
    				cout<<"2-methylpentane"<<endl;
    			else if(temp==3)	//乘积为3
    				cout<<"2,3-dimethylbutane"<<endl;
    			else if(temp==4)	//乘积为4
    				cout<<"3-methylpentane"<<endl;
    			flag=1;
    			break;
    		}
    	}
    	if(!flag) cout<<"n-hexane"<<endl;
    }
    return 0;
}