链式前向星复习图论

B3862 图的遍历(简单版) - 洛谷 | 计算机科学教育新生态

复制代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5+10;
int head[N];
int tot;
int n,m;
int pos;
bool vis[N];
struct Edge{
	int next;
	int to;
}e[N];
void init()
{
	for(int i = 1 ; i <= n ; i++)
	head[i] = -1;
}
void add(int u,int v)
{
	++tot;
	e[tot].next = head[u];
	e[tot].to = v;
	head[u] = tot;
}
void dfs(int current)
{
	if(current > pos)
	pos = current;
	int k = head[current];//取出连接第一条边的信息 

	while(k != -1)
	{
		int to = e[k].to;//指向的点
		int temp = head[to];//链表to点连接第一条边 
		if(vis[to] == false)
		{	
			vis[to] = true;
			dfs(to);
		}
		k = e[k].next;
	}
}
int main(void)
{
	cin >> n >> m;
	init();
	for(int i = 1 ; i <= m ; i++)
	{
		int u,v;
		cin >> u >> v;
		add(u,v);
	}
	for(int i = 1 ; i <= n ; i++)
	{
		memset(vis,false,sizeof(vis));
		vis[i] = true;
		pos = i;
		dfs(i);
		cout << pos << " "; 
	}
	return 0;
}

P3916 图的遍历 - 洛谷 | 计算机科学教育新生态

90分

复制代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5+10;
int head[N];
int tot;
int n,m;
int pos;
bool vis[N];
struct Edge{
	int next;
	int to;
}e[N];
void init()
{
	for(int i = 1 ; i <= n ; i++)
	head[i] = -1;
}
void add(int u,int v)
{
	++tot;
	e[tot].next = head[u];
	e[tot].to = v;
	head[u] = tot;
}
void dfs(int current)
{
	if(current > pos)
	pos = current;
	int k = head[current];//取出连接第一条边的信息 

	while(k != -1)
	{
		int to = e[k].to;//指向的点
		int temp = head[to];//链表to点连接第一条边 
		if(vis[to] == false)
		{	
			vis[to] = true;
			dfs(to);
		}
		k = e[k].next;
	}
}
int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	init();
	for(int i = 1 ; i <= m ; i++)
	{
		int u,v;
		cin >> u >> v;
		add(u,v);
	}
	for(int i = 1 ; i <= n ; i++)
	{
		memset(vis,false,sizeof(vis));
		vis[i] = true;
		pos = i;
		dfs(i);
		cout << pos << " "; 
	}
	return 0;
}

100分

复制代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5+10;
int head[N];
int tot;
int n,m;
int pos;
bool vis[N];
int ans[N];
struct Edge{
	int next;
	int to;
}e[N];
void init()
{
	for(int i = 1 ; i <= n ; i++)
	head[i] = -1;
}
void add(int u,int v)
{
	++tot;
	e[tot].next = head[u];
	e[tot].to = v;
	head[u] = tot;
}
void dfs(int current,int maxpos)
{
	if(vis[current] == false)
	ans[current] = maxpos;
	vis[current] = true;
	int k = head[current];
	while(k != -1)
	{
		int to = e[k].to;//指向的点
		int temp = head[to];//链表to点连接第一条边 
		if(vis[to] == false)
		{	
			ans[to] = maxpos;
			vis[to] = true;
			dfs(to,maxpos);
		}
		k = e[k].next;
	}
}
int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	init();
	for(int i = 1 ; i <= m ; i++)
	{
		int u,v;
		cin >> u >> v;
		add(v,u);//方向建立边 
	}
	for(int i = n ; i >= 1 ; i--)
	{
		dfs(i,i); 
	}
	for(int i = 1 ; i <= n ; i++)
	cout << ans[i] << " ";
	return 0;
}

P1700 USACO19OPEN Milk Factory B - 洛谷 | 计算机科学教育新生态

复制代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5+10;
int head[N];
int ans = 1e9;
int cnt;
int tot;
int n;
bool vis[N];
struct Edge{
	int next;
	int to;
}e[N];
bool found;
void add(int u,int v)
{
	tot++;
	e[tot].next = head[u];
	e[tot].to = v;
	head[u] = tot;
}
void dfs(int current)
{
	vis[current] = true;
	cnt++;
	int k = head[current];
	while(k != -1)
	{
		int to = e[k].to;
		if(vis[to] == false)
		{
			vis[to] = true;
			dfs(to);
		}
		k = e[k].next;
	}
}
int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	
	for(int i = 1 ; i <= n ; i++)
	head[i] = -1;
	
	for(int i = 1 ; i <= n-1 ; i++)
	{
		int u,v;
		cin >> u >> v;
		add(v,u);//反向建立边
	}
	for(int i = 1 ; i <= n ; i++)
	{
		cnt = 0;
		memset(vis,false,sizeof(vis));
		dfs(i);
		if(cnt == n)
		{
			found = true;
			ans = min(ans,i);
		}
	}
	if(found)
	cout << ans;
	else
	cout << -1;
	return 0;
}
相关推荐
北极有牛3 分钟前
cuda算子--矩阵转置
人工智能·算法
程序猫.21 分钟前
算法刷题笔记:模拟题从入门到实战(含 LeetCode 例题与习题)
java·数据结构·算法
liliangcsdn25 分钟前
zpos因果对冲的分析和示例
算法
Shan120539 分钟前
经典算法题学习:跳跃游戏IV(一)
算法
AIGCmagic社区1 小时前
灵巧手VLA真机均分71%,北大DeCAL用接触门控接入触觉
人工智能·算法·aigc·ai多模态
迷途之人不知返1 小时前
算法系列4:前缀和
算法
吠品1 小时前
Python 写入 Excel 的两种主流方案实际用法总结
c语言·开发语言·算法
Zane19941 小时前
归并排序和堆排序都能保证O(nlogn),为什么谁也没法把稳定和原地两个优点占全
算法·排序算法
天天喝旺仔1 小时前
Go 泛型实战:从类型参数、约束到可复用泛型容器与函数
数据结构·算法·容器·go
可爱的小小小狼1 小时前
【无标题】
java·算法