倒计时57天

复习3-1:知识点类

1.

//dfs方面主要知道了一个模板:
void dfs(int x,int fa)
{
    for(auto [v,w]:ve[x])
    {
       if(v==fa)continue;
       dis[v]=dis[x]+w;
       dfs(v,x);
    }
}
/*
比如我们知道了一颗二叉树与它的路径以及路径长度,就可以通过这个模板求出各点到x的长度
如:dfs(1,0),我们就可以知道其他点到1的距离,dfs(2,0),我们就可以知道其他点到2的距离。
*/

例题:

2.串门 - 蓝桥云课 (lanqiao.cn)

P5908 猫猫和企鹅 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1395 会议 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)(但这题用这个思路会超时70/100)

2.

E-小红树上染色_牛客周赛 Round 30 (nowcoder.com)

//这个也是二叉树+dfs遍历类的,但明显不能用上面那个模板,是概率类问题

void dfs(int x,int fa)
{
    dp[x][1]=1,dp[x][0]=1;
    for(auto i:ve[x])
    {
        if(i==fa)continue;
        dfs(i,x);
        dp[x][0]=dp[x][0]*dp[i][1]%mod;
        dp[x][1]=dp[x][1]*(dp[i][1]+dp[i][0])%mod;
    }
}

3.并查集

倒计时61天-CSDN博客

//这个我觉得我当时笔记打的很详细了,把例题代码写一下就差不多了
#include 
using namespace std;
#define int long long
const int N = 2e5 + 6;
const int inf = 0x3f3f3f3f;
int a[110];

/*
int find(int i) {
	while (i != a[i]) {
		i = a[i];
	}
	return i;
}
*/
int find(int i) {
	if (a[i] != i) {
		a[i] = find(a[i]);
	}
	return a[i];
}

void solve() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	int x;
	cin >> x;
	cout << find(x);
}

signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int t;
	t = 1;
	//cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

—————————————————————————————————————————————————————————————————————————————————————————

#include 
using namespace std;
#define int long long
const int N = 2e5 + 6;
const int inf = 0x3f3f3f3f;
int a[110];

/*
int find(int i) {
	while (i != a[i]) {
		i = a[i];
	}
	return i;
}
*/
int find(int i) {
	if (a[i] != i) {
		a[i] = find(a[i]);
	}
	return a[i];
}

void find2(int x, int y) {
	int fx = find(x);
	int fy = find(y);
	if (fx != fy) {
		a[fx] = fy;
	}
}

void solve() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		a[i] = i;
	}
	int m;
	cin >> m;
	for (int i = 1; i <= m; i++) {
		int u, v;
		cin >> u >> v;
		find2(u, v);
	}
	int cn = -1;
	for (int i = 1; i <= n; i++) {
		if (a[i] == i)
			cn++;
	}
	cout << cn;
}

signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int t;
	t = 1;
	//cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

/*
5 3
1 2
3 4
2 5
*/

—————————————————————————————————————————————————————————————————————————————————————————

#include 
using namespace std;
#define int long long
const int N = 2e5 + 6;
const int inf = 0x3f3f3f3f;

struct node {
	int sx, ex, le;
} a[N];
int b[N];

bool cmp(node x, node y) {
	return x.le < y.le;
}

int find1(int x) {
	if (x != b[x]) {
		b[x] = find1(b[x]);
	}
	return b[x];
}

void find2(int x, int y) {
	int fx = find1(x);
	int fy = find1(y);
	b[fx] = fy;
}

void solve() {
	int n, m, ans = 0;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		b[i] = i;
	}
	for (int i = 1; i <= m; i++) {
		cin >> a[i].sx >> a[i].ex >> a[i].le;
	}
	sort(a + 1, a + 1 + m, cmp);
	for (int i = 1; i <= m; i++) {
		if (find1(a[i].sx) != find1(a[i].ex)) {
			find2(a[i].sx, a[i].ex);
			ans += a[i].le;
		}
	}
	cout << ans;
}

signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int t;
	t = 1;
	//cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

/*
6 10
1 3 1
1 4 5
3 4 5
1 2 6
2 3 5
2 5 3
3 5 6
5 6 6
3 6 4
4 6 2
*/

4.求逆元

//求Cn的所有组合数
#include 
using namespace std;
#define int long long
const int N = 2e5 + 6;
const int inf = 0x3f3f3f3f;
int b[1100], c[1100];
int mod = 1e9 + 7;

int pow(int a, int b) {
	int result = 1;
	while (b) {
		if (b & 1) {
			result = result * a % mod;
			b /= 2;
			a = a * a % mod;
		} else {
			b /= 2;
			a = a * a % mod;
		}
	}
	return result;
}

int answer(int n, int m) {
	int ans = b[n];
	ans = ans * c[m] % mod;
	ans = ans * c[n - m] % mod;
	return ans;
}

void solve() {
	int n;
	cin >> n;
	b[0] = 1;
	b[1] = 1;
	for (int i = 2; i <= n; i++) {
		b[i] = (i % mod) * (b[i - 1] % mod) % mod; //求1-n的阶乘
	}
	c[0] = 1;
	for (int i = 1; i <= n; i++) {
		c[i] = pow(b[i], mod - 2) % mod;//求1-n阶乘的逆元
	}
	for (int i = 0; i <= n; i++) {
		cout << answer(n, i) << endl;
	}
}

signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int t;
	t = 1;
	//cin>>t;
	while (t--) {
		solve();
	}
	return 0;
}

5555怎么办,感觉爱上了算法啊啊啊啊啊啊啊啊啊o(* ̄▽ ̄*)ブ

你可能感兴趣的:(深度优先,算法,图论)