1 条题解

  • 0
    @ 2024-12-24 10:06:05

    C :

    #include<stdio.h>
    int main()
    {
    	int n,k;
    	scanf("%d%d",&n,&k);
    	int x[100],y[100],i;
    	for(i=0;i<k;i++)
    		scanf("%d%d",&x[i],&y[i]);
    	int x1,y1;
    	scanf("%d%d",&x1,&y1);
    	int flag=0;
    	for(i=0;i<k;i++)
    	{
    		if(x1==x[i]||x1==y[i])
    		{
    			flag=1;
    				break;
    		}
    	}
    	if(flag==1)
    		for(i=0;i<k;i++)
    			{
    			if(y1==x[i]||y1==y[i])
    			{
    				flag=2;
    					break;
    			}
    		}
    	if(flag==2)
    		printf("YES\n");
    	else
    		printf("NO\n");
    	return 0;
    }
    

    C++ :

    #include <stdio.h>
    #include <stdlib.h>
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    #define OVERFLOW -1
    #define MAX_TREE_SIZE 100
    typedef int Status; /* 函数结果状态代码,如OK等 */
    typedef char TElemType;
    typedef struct {
    	TElemType data;
    	int parent; /* 双亲位置域 */
    } PTNode;
    typedef struct {
    	PTNode nodes[MAX_TREE_SIZE+1];
    	int n; /* 结点数 */
    } PTree;
    typedef PTree MFSet;
    int find_mfset(MFSet S, int i) {  // 算法6.8
       // 找集合S中i所在子集的根
       int j;
       if (i<1 || i>S.n) return -1;   // i不是S中任一子集的成员
       for (j=i; S.nodes[j].parent>0; j=S.nodes[j].parent);
       return j;
    }// find_mfset
    Status merge_mfset(MFSet &S, int i, int j) {  // 算法6.9
       // S.nodes[i]和S.nodes[j]分别为S中两个互不相交的子集Si和Sj的根结点。
       // 求并集Si∪Sj。
       if (i<1 || i>S.n || j<1 || j>S.n) return ERROR;
       S.nodes[i].parent = j;
       return OK;
    } // merge_mfset
    Status mix_mfset(MFSet &S, int i, int j) {  // 算法6.10
    	// S.nodes[i]和S.nodes[j]分别为S中两个互不相交的子集Si和Sj的根结点
    	// 求并集Si∪Sj。
    	if (i<1 || i>S.n || j<1 || j>S.n) return ERROR;
    	if (S.nodes[i].parent>S.nodes[j].parent) {   // Si所含成员数比Sj少
    		S.nodes[j].parent+=S.nodes[i].parent;
    		S.nodes[i].parent=j;
    	} else {                                     // Sj的元素比Si少
    		S.nodes[i].parent+=S.nodes[j].parent;
    		S.nodes[j].parent=i;
    	}
    	return OK;
    } // mix_mfset
    int fix_mfset(MFSet &S, int i) {  // 算法6.11
    	// 确定i所在子集,并将从i至根路径上所有结点都变成根的孩子结点。
    	int j,k,t;
    	if (i<1 || i>S.n) return -1;       // i 不是S中任一子集的成员
    	for (j=i; S.nodes[j].parent>0; j=S.nodes[j].parent);
    	for (k=i; k!=j; k=t) {
    		t=S.nodes[k].parent;  S.nodes[k].parent=j;
    	}
    	return j;
    } // fix_mfset
    int main() {
    	int n,i,x,y,k;
    	MFSet Set;
    	scanf("%d%d", &n, &k);
    	Set.n = n;
    	for(i=1;i<=n;i++) {
    		Set.nodes[i].data=i;
    		Set.nodes[i].parent=-1;
    	} // 建立n个只有一个元素的集合
    	for(i=1;i<=k;i++) {
    		scanf("%d%d", &x, &y);
    		x = find_mfset(Set, x); // 找到子集的根节点
    		y = find_mfset(Set, y); // 找到子集的根节点
    		mix_mfset(Set, x, y);
    		fix_mfset(Set, x);
    		fix_mfset(Set, y);
    	}
    	scanf("%d%d", &x, &y);
    	x = find_mfset(Set, x); // 找到子集的根节点
    	y = find_mfset(Set, y); // 找到子集的根节点
    	if (x == y)
    		puts("YES");
    	else
    		puts("NO");
    	return 0;
    }
    
    
    • 1

    信息

    ID
    1876
    时间
    1000ms
    内存
    32MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者