hdoj 4547 cd操作

本文分享了一个图论算法的实战案例,作者通过比赛经历详细解析了如何利用递归深度优先搜索等技术解决图论问题,并提供了完整的代码实现。

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

说实话,对这种题可以1A我是很没有信心的,因为我的思路虽然有的时候很清晰但是代码实现能力却不怎么样,老是很长的代码还容易犯错,所以这中题比赛的时候我是会放在最后写的,也不是不写的,不过今天还好,除了那个n=1没有考虑外,其它都对了,然后就是改了一下就a了,不高兴那是假的,下面贴代码吧~感觉我的代码写的好笨,不知道有没有什么短的方便的代码!

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<climits>
#include<map>
using namespace std;
#define rep(i,n) for(int i=0; i<n; i++)
#define repf(i,n,m) for(int i=(n); i<=(m); ++i)
#define repd(i,n,m) for(int i=(n); i>=(m); --i)
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
#define fab(a) ((a)>0?(a):(0-(a)))
#define ll long long
#define arc(a) ((a)*(a))
#define inf 100000
#define exp 0.000001
#define N 100000
struct node
{
	int y,pre;
}a[N+10];
int pre[N+10];
int n,m;
int len,cont;
int h[N+10];
int fa[N+10];
int pp[N+10];
void addpage(int x,int y)
{
	a[len].y=y;a[len].pre=pre[x];pre[x]=len++;
}
void dfs(int stage,int s)
{
    h[s]=stage;
	for(int i=pre[s]; i!=-1; i=a[i].pre)
	{
		int y=a[i].y;
		fa[y]=s;
		dfs(stage+1,y);
	}
}
int lcy(int x,int y)
{
     int sum=0;
	 if(h[x]>h[y]){
		 while(h[x]>h[y]){
			 x=fa[x];sum++;
		 }
	 }
	  if(x==y)  return sum;
	 if(h[y]>h[x])
		{
		 while(h[y]>h[x]) y=fa[y];
		}
	 while(x!=y)
	 {
		 sum+=1;
		 x=fa[x];
		 y=fa[y];
	 }
	 sum++;
	 return sum;
}
void fun()
{
	scanf("%d%d",&n,&m);
	cont=1;
	int x,y;
    map<string,int> q;
	string s1,s2;
	 map<string,int>::iterator iter;
	repf(i,1,n-1)
	{
		cin>>s1>>s2;
		iter=q.find(s1);
		if(iter==q.end()) 
		{
		   	x=cont++;q.insert(map<string,int>::value_type(s1,x));
		}
		else
			x=iter->second;
		iter=q.find(s2);
		if(iter==q.end())
		{
			y=cont++;q.insert(map<string,int>::value_type(s2,y));
		}
		else
			y=iter->second;
	   addpage(y,x);
	   pp[x]++;
	}
	repf(i,1,cont-1)
		if(pp[i]==0)
		{  dfs(1,i); break;}
	while(m--){
    if(n==1)  {printf("0\n");continue;}
	cin>>s1>>s2;
    iter=q.find(s1); x=iter->second;
	iter=q.find(s2); y=iter->second;
	printf("%d\n",lcy(x,y));
	}
}
int main()
{ 
	int test;
	scanf("%d",&test);
	while(test--)
	{
		len=1;
		memset(fa,-1,sizeof(fa));
		memset(pre,-1,sizeof(pre));
		memset(h,-1,sizeof(h));
		memset(pp,0,sizeof(pp));
		fun();
	}
   return 0;
}
  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡定的小Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值