2021.1.20
上午:
并查集網課(正月點燈籠)
下面是例題:
//并查集找環 /* 題解: 【1】用一個parent[];產生聯系 【2】將點與點合并時,分別找到兩點的根節點合并 【3】如果兩個點的根節點相同就說明,這里有一個環 (優化)【4】將根連在一起時可以加一個判斷高度的, 將矮的加到高的上,這樣最大的高度不會變 */ #include<stdio.h> //將數組全部賦值為; void initialise(int *parent,int *rank) {for(int i=0;i<6;i++){parent[i]=-1;rank[i]=0;} } int find_root(int num,int *parent) { // if(num_root==num) // return num; // else // { // return( parent[num]=find_root(parent[num]); // }int num_root=num;while(parent[num_root]!=-1){//將自己直接連接到父親結點的num_root=parent[num_root];//}return num_root; }//合并x,y(當它倆根節點相同不用合并時返回0,否則返回1 int combine(int x,int y,int *parent,int *rank) {int x_root=find_root(x,parent);int y_root=find_root(y,parent);if(x_root==y_root){return 0;}else{//即,x比y高,將y_root連接到x_root上來if(rank[x_root]>rank[y_root])parent[y_root]=x_root;else if(rank[x_root]<rank[y_root])parent[x_root]=y_root;else{parent[x_root]=y_root;rank[y_root]++;}return 1;} } int main() {int parent[10000];int rank[10000];//樹的高度//將parent數組全部賦值為-1(可用于判斷是否為根節點)initialise(parent,rank);//這樣寫代表這兩個之間被線所連接int line[6][2]={{0,1},{1,2},{1,3},{3,4},{2,4},{2,5}};for(int i=0;i<6;i++){int x=line[i][0];int y=line[i][1];int book=combine(x,y,parent,rank);if(book==0){printf("Find a cycle.\n");return 0;}}printf("Never find a cycle.\n");return 0; }下午:
親戚
這個題和上面那個一樣
/* 思路: 【1】就是要將前一個和后一個聯系起來 【2】即,將有親戚關系的一群人建成一棵樹(不一定為1棵),形成森林 【3】然后找他們的根節點,如果根節點相同就是一棵樹上,有親戚關系 注意: 是要將m2根節點變成m1根節點的父親 數組大小要看題目的數據范圍 先要將自己的父親賦初值為自己本身,后面才能以此來判斷 */ #include<stdio.h> int father[100000]; int findroot(int m1) {//當自己的父親為自己時,自己就是根節點if(father[m1]==m1)return m1;elsereturn father[m1]=findroot(father[m1]); } int main() {int n,m,p;scanf("%d %d %d",&n,&m,&p);//先將每個人的父親初始化為自己(方便找根節點)for(int i=1; i<=n; i++){father[i]=i;}for(int i=1; i<=m; i++){int m1,m2;scanf("%d %d",&m1,&m2);if(findroot(m1)!=findroot(m2))father[findroot(m1)]=findroot(m2);//將兩點的根節點連起來//father[m1]=m2;}for(int i=1; i<=p; i++){int p1,p2;scanf("%d %d",&p1,&p2);//如果根節點是一樣的,那么就在同一棵樹上if(findroot(p1)==findroot(p2)){printf("Yes\n");}elseprintf("No\n");}return 0; }P1035新二叉樹
//別在洛谷用getchar(); //如果一個個輸入字符就用cin>>,別用scanf搭配getchar() /* 思路: 【1】直接把樹的結點聯系起來了 【2】然后按前序遍歷,輸出 【3】這個題最重要的是要將那一行三個字符聯系起來 (所以使用了一個結構體) */ #include<bits/stdc++.h> using namespace std; typedef struct node {char data;char left;char right; }Node; Node tree[30]; int n; void preorder(char root) {if(root=='*')return;for(int i=0;i<n;i++){if(root==tree[i].data){printf("%c",root);preorder(tree[i].left);preorder(tree[i].right);}} } int main() {scanf("%d",&n);char ch;for(int i=0;i<n;i++){//一定要注意字符輸入//別用會錯(已試毒) //getchar();//吸收回車符cin>>tree[i].data>>tree[i].left>>tree[i].right;}char root=tree[0].data;preorder(root);printf("\n");return 0; }晚上:
P4913二叉樹的深度
(應該是深搜)
這個題又和上面那個新二叉樹(異曲同工)
#include<stdio.h> typedef struct node {int left;int right; }Node; int n; Node Tree[100000]; int max=0; //結點和高度 void findhigh(int dot,int high) {if(dot==0){if(high>max)max=high;return;}findhigh(Tree[dot].left,high+1);findhigh(Tree[dot].right,high+1); } int main() {scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d %d",&Tree[i].left,&Tree[i].right);}findhigh(1,1);printf("%d",max-1);return 0; }總結
- 上一篇: 第14届军警狙击手世界杯:中国队包揽全部
- 下一篇: 研究了一堆英语学习软件,发现了一个美国宝