首页 > 其他分享 >寒假集训Day7

寒假集训Day7

时间:2024-01-24 14:44:21浏览次数:29  
标签:main vector int Day7 dfs 寒假 存图 include 集训

今天开始了图论,讲了一些基础内容
首先是存图

存图

这里讲的跟当时高中讲的有些区别,高中当时说了一个链式前向星存图现在没讲,不过没关系,反正讲了也不会,先把今天讲的说了
一个是非常简单的邻接矩阵存图
一个是利用二维vector,每一个vector的行首存初始点,然后一点一点把去向的点往里push,其实这个高中的时候讲过,但是高中的时候感觉有点高深,再加上有链式前向星
就一直不怎么理解,但是链式前向星一直是不会的,就是照着板子写,反而大学之后这个理解一些了

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 100;
struct Edge{
    int to,value;  
}e;
vector<Edge> G[N+1];
int m,n,tmp;
int main(){
    cin>>n>>m;
    for (int i=0;i<m;i++){
        cin>>tmp>>e.to>>e.value;
        G[tmp].push_back(e);
    }
    for (int i=1;i<=n;i++){
        for (int j=0;j<G[i].size();j++){
            e=G[i][j];
            cout<<"From "<<i<<" to "<<e.to<<", the cost is "<<e.value<<endl;
        }
    }
    return 0;
}

需要存边权的话是这么写的,如果不需要存边权的话

#include <bits/stdc++.h>
using namespace std;
int n,m;
vector <int> t[10001];
int main () {
	scanf("%d %d" ,&n,&m);
	for(int i = 1;i <= m; i++) {
		int u,v;
		scanf("%d %d" ,&u,&v);
		t[u].push_back(v);
		t[v].push_back(u);
	}
	for(int i = 1;i <= n; i++) {
		printf("%d " ,t[i].size());
		
		for(int j = 0;j < t[i].size(); j++) {
			tem[j] = t[i][j];
		}
		sort(tem,tem + t[i].size());
		for(int k = 0;k < t[i].size(); k++) {
			printf("%d " ,tem[k]);
			tem[k] = 0;
		}
		printf("\n");
	}
	return 0;
}

这么写就可以了,存无向图的时候正着存一下反着存一下,意味两边都可以互相走就行

dfs

这里主要就是想记录一下在vector存图的情况下用dfs遍历图怎么遍历
我们需要一个judge数组来帮助我们判断当前的点走没走过
然后在dfs函数中,对于我们现在遇到的每一个点,首先,我们要判断这个点接下来还有没有路可以走
如果有的话,我们遍历所有的路,对于我们遇到的每一条路,我们判断他走没走过,如果没走过,我们调用dfs,沿着这条路继续搜下去直到没有路为止

#include <bits/stdc++.h>
using namespace std;
int n,m;
vector<int> a[100001];
bool f[100001];
int ans[100001] = { };
void dfs(int n,int u) {
	if(a[u].empty()) return;
	for(int i = 0;i < a[u].size(); i++) {
		if(f[a[u][i]] == false) {
			f[a[u][i]] = true;
			ans[n] = max(ans[n],a[u][i]);
			dfs(n,a[u][i]);
		}
	}
}
int main () {
	memset(f, false, sizeof(f));
	scanf("%d %d" ,&n,&m);
	for(int i = 1;i <= n; i++) {
		ans[i] = i;
	}
	for(int i = 1;i <= m; i++) {
		int u,v;
		scanf("%d %d" ,&u,&v);
		a[u].push_back(v);
	}
	for(int i = 1;i <= n; i++) {
		dfs(i,i);
		printf("%d " ,ans[i]);
		memset(f,false,sizeof(f));
	}
	
	return 0;
}

拓扑排序

根据百度百科的定义,拓扑排序是用了来解决这样问题的:对于一个有向无环图,把其顶点转化成一个线性序列,要求这个序列,对于任意一条边而言起点都在终点前面
那么他的过程就是这样的:
首先我们找到一个入度为0的点,输出这个点,然后删掉这个点,继续找下面入度为0的点,重复上述过程,就能得到拓扑排序中要求的线性序列
从CSDN找了个图,具体解释一下拓扑排序的过程:

首先找到1,输出1,然后删掉1

重复上述过程找到2

然后以此类推



具体的代码实现是这样的:

#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> a[1000001];
queue<int> q;
int in[10000001] = { };
int main () {
	scanf("%d" ,&n);
	for(int i = 1;i <= n; i++) {
		int x;
		while(1) {
			scanf("%d" ,&x);
			if(x == 0) break;
			a[i].push_back(x);
			in[x]++;
		}
		
	}
	for(int i = 1;i <= n; i++) {
		if(in[i] == 0) {
			q.push(i);
		}
	}
	while(!q.empty()) {
		int sum = q.front();
		printf("%d " ,sum);
		q.pop();
		for(int i = 0;i < a[sum].size(); i++) {
			int now = a[sum][i];
			in[now]--;
			if(in[now] == 0) {
				q.push(now);
			}
		}
	}
	return 0;
}

标签:main,vector,int,Day7,dfs,寒假,存图,include,集训
From: https://www.cnblogs.com/Crazyman-W/p/17980061

相关文章

  • 集训队互测2023 彩虹航线
    给定一个\(n\)个点\(m\)条边的二分图,每个点的度数都\(\leqslantk\),且每条边的本质不同的备选颜色数目都\(\geqslantk\),求一组边染色,可以证明一定有解。有一个乱搞是每次在加入一条边时按照颜色从小到大,如果当前可以加入则加入,否则如果只会影响一条边则将这条边断掉后再重......
  • 寒假怎么制定学习计划高效?可以给自己制定学习计划的软件
    随着寒冬的降临,寒假也随之而至。对于中小学生和大学生们来说,这是一个放松身心、挖掘兴趣、提升学业的黄金时期。然而,众多学子纷纷表示,寒假在家中往往面临太多诱惑,难以按时完成每天的学习目标。那么如何应对这个问题呢?一款智能的学习计划制定软件或许可以成为解决之道。对于那些......
  • 寒假集训Day6
    Jellyfishandapplehttps://www.luogu.com.cn/problem/CF1875C这道题使用的是贪心首先对于多于m的苹果个数,可以直接分给m个人,所以先把n对m取模,然后考虑剩下的苹果然后考虑不能分的情况如果求出m和n的最大公约数,把m和n同时除以最大公约数,那么得到的人数应该是2k,否则的话就说......
  • 集训队论文浅读 - 信息学竞赛中构造题的常用解题方法
    抽屉原理把\(n\)个物品放入\(k\)个抽屉中,其中至少有一个抽屉中有\(\lceil\dfrac{n}{k}\rceil\)个物品,并一定有一个抽屉包含\(\lfloor\dfrac{n}{k}\rfloor\)个物品。构造题中考虑构造不同情况的抽屉,应对构造权值类问题。对于取整符号要敏感。Codeforces1450C2构......
  • 2024寒假集训 进阶训练赛 (六)部分题解
    A统计单词数题解注意是否是单词。CODECPP#include<iostream>#include<string>#include<algorithm>usingnamespacestd;intmain(){stringword,article;getline(cin,word);getline(cin,article);//转换为小写字母transform(word.beg......
  • 大三寒假学习进度笔记14
    今天在编写项目时了解到了PyTorch3D这个库,因此对这个库进行了一定的了解并尝试使用这个库PyTorch3D旨在与深度学习方法稳定集成,以预测和处理3D数据。在进行安装PyTorch3D时产生了很多错误。在anaconda虚拟环境使用condainstall下载PyTorch3D时总是会卡在solvingenvironment这......
  • 寒假生活(14)
    我们的团队项目是前后端同时进行,然后再进行精修。我现在只剩下小程序个人中心部分了,这几天先等其他部分的后端完成,再一同推进进度,所以今天继续python学习。今天的内容是异常处理。异常处理是一种在程序遇到错误或异常情况时进行捕获、处理和恢复的机制。在Python中,你可以使用try.......
  • 寒假学习(13)
    今天我继续学习python知识。今天主要学习的是文件操作,这个知识我从学习C语言开始就一直不熟悉,不仅因为它在教学的最后一章,知识讲的较少,更引文平时学习中基本用不到文件操作,所以这部分我用了很长时间。打开和关闭文件:open() 函数:用于打开一个文件,并返回一个文件对象。有两个......
  • 寒假生活指导15
    #相关模块导入fromseleniumimportwebdriver#selenium4版本必须要设置浏览器选项,否则会闪退option=webdriver.EdgeOptions()option.add_experimental_option("detach",True)#实例化浏览器驱动对象,并将配置浏览器选项driver=webdriver.Edge(options=option)#......
  • 寒假生活指导14
    XPATH语法:  1.路径查询        //:查找所有子孙节点,不考虑层级关系        / :找直接子节点    2.谓词查询        //div[@id]          //div[@id="maincontent"]        3.属性查询        //@cl......