CodeForces 131D【图特性+BFS】

博客介绍了如何解决CodeForces上的131D问题,该问题涉及图论和搜索算法。关键在于理解题目中只有一个环,并且节点到环的距离是需要求解的目标。通过从度为1的节点开始搜索并使用BFS计算距离,同时利用标记避免重复处理。博主强调在解决此类问题时要考虑图的特性,如节点度数、搜索方向(BFS或DFS),并提醒在确定思路后要多验证反例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:
只有一个环,然后环都是0(环缩点相当于树的根),然后其余的输出到根的距离
思路:
可以从度为1的 开始搜 把那些分支全标记掉,然后再取没有标记掉的,BFS一下搞出距离。
具体这个标记:
倒着搜这样肯定没有多对一,标记掉度等于2的那些点就好了,度>2的要减减,而且环里的点的度不可能搜到度 = 2 因为环=点的度为2,他又连出一条边 度=3。
后话:
这种n个点 n条边/n-1条边的题都是套路了,要仔细考虑图特性:点的度(出度,入度),怎么搜(顺着搜,倒着搜,BFS好写还是DFS好写)
但是一旦确定思路,要多举反例,谨防入坑!!

#include<bits/stdc++.h>  
using namespace std;  
typedef long long LL;  
  
const int N=3e3+10;  
  
struct asd{  
    int to;  
    int next;  
};  
asd e[N*2];  
int head[N],tol;  
int n,m;
int pre[N];
bool vis[N],used[N];

void add(int u,int v)
{  
	e[tol].to=v;  
	e[tol].next=head[u];  
	head[u]=tol++;
}

void solve1()
{
	queue<int>q;
	for(int i=1;i<=n;i++)
	{
		if(pre[i]==1) 
		{
			q.push(i);
			vis[i]=true;
		}
	}
	
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int i=head[u];~i;i=e[i].next)
		{
			int v=e[i].to;
			if(vis[v]) continue;
			if(pre[v]==2)
			{
				vis[v]=true;
				q.push(v);
			}
			pre[v]--;
		}
	}
}

int ans[N];
void solve2()
{
	queue<int>q;
	for(int i=1;i<=n;i++)
		if(!vis[i])
		{
			ans[i]=0;
			used[i]=true;
			q.push(i);
		}
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int i=head[u];~i;i=e[i].next)
		{
			int v=e[i].to;
			if(used[v]) continue;
			ans[v]=ans[u]+1;
			used[v]=true;
			q.push(v);
		}
	}
}


int main()
{
	int u,v;
	scanf("%d",&n);
	
	tol=0;
	memset(head,-1,sizeof(head));
	
	for(int i=0;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
		pre[u]++;
		pre[v]++;
	}
	
	solve1();
	solve2();
	
	for(int i=1;i<=n;i++)
		printf("%d ",ans[i]);
	
	return 0;
}

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

6
1 2
2 3
3 1
1 4
4 5
4 6

*/



### Codeforces Problem 1014D 解答与解释 当前问题并未提供关于 **Codeforces Problem 1014D** 的具体描述或相关背景信息。然而,基于常见的竞赛编程问题模式以及可能涉及的主题领域(如数据结构、算法优化等),可以推测该问题可能属于以下类别之一: #### 可能的解法方向 如果假设此问题是典型的计算几何或者论类题目,则通常会涉及到如下知识点: - 遍历(DFS 或 BFS) - 贪心策略的应用 - 动态规划的状态转移方程设计 由于未给出具体的输入输出样例和约束条件,这里无法直接针对Problem 1014D 提供精确解答。但是可以根据一般性的解决思路来探讨潜在的方法。 对于类似的复杂度较高的题目,在实现过程中需要注意边界情况处理得当,并且要充分考虑时间效率的要求[^5]。 以下是伪代码框架的一个简单例子用于说明如何构建解决方案逻辑流程: ```python def solve_problem(input_data): n, m = map(int, input().split()) # 初始化必要的变量或数组 graph = [[] for _ in range(n)] # 构建邻接表或其他形式的数据表示方法 for i in range(m): u, v = map(int, input().split()) graph[u].append(v) result = [] # 执行核心算法部分 (比如 DFS/BFS 遍历) visited = [False]*n def dfs(node): if not visited[node]: visited[node] = True for neighbor in graph[node]: dfs(neighbor) result.append(node) for node in range(n): dfs(node) return reversed(result) ``` 上述代码仅为示意用途,实际应用需依据具体题目调整细节参数设置及其功能模块定义[^6]。 #### 关键点总结 - 明确理解题意至关重要,尤其是关注特殊测试用例的设计意。 - 对于大规模数据集操作时应优先选用高效的时间空间性能表现良好的技术手段。 - 结合实例验证理论推导过程中的每一步骤是否合理有效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值