hdu 1181——变形课

本文介绍两种解决图中两点间最短路径问题的方法:一种是使用Dijkstra算法求解最短路径;另一种是通过深度优先搜索(DFS)来判断两点是否可达。通过具体的代码实现,展示了如何构造图的数据结构并进行搜索。

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

做法一:最短路 dij

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

#define INF 1000001
int map[26][26];
int dis[26];
int vis[26];
int s='b'-'a',e='m'-'a';

void makeset()
{
	int i,j;
	for(i=0;i<26;i++)
		for(j=0;j<26;j++)
			map[i][j]=INF;
	for(i=0;i<26;i++)
	{
		dis[i]=INF;
		vis[i]=0;	
		map[i][i]=0;
	}
	dis[s]=0;
	vis[s]=1;
}

int dij()
{
	int i,j;
	int min;
	int temp;
	for(i=0;i<26;i++)
		dis[i]=map[s][i];
		
	for(i=0;i<26;i++)
	{
		min=INF;
		temp=s;
		for(j=0;j<26;j++)
		{
			if(min>dis[j]&&!vis[j])
			{
				min=dis[j];
				temp=j;
			}	
		}
		vis[temp]=1;
		for(j=0;j<26;j++)
		{
			if(!vis[j]&&dis[j]>dis[temp]+map[temp][j])
				dis[j]=dis[temp]+map[temp][j];
		}
		if(dis[e]<INF)
			return 1;
	}
		return 0;

	
}


int main()
{
	int l;
	char str[100];
	makeset();
	while(cin>>str)
	{
		if(str[0]=='0')
		{
			
			if(dij())
			{
				printf("Yes.\n");
			}
			else
				printf("No.\n");
			makeset();	
			continue;
		}
		else
		{
			l=strlen(str);
			map[str[0]-'a'][str[l-1]-'a']=1;
		}
	}
	return 0;
}

做法2:深搜

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

int map[26][26];
int vis[26];
int flag;
int s='b'-'a',e='m'-'a';

void dfs(int x)
{
	int i;
	if(flag)
		return ;
	if(x==e)
	{
		flag=1;
		return ;
	}
	for(i=0;i<26;i++)
	{
		if(map[x][i]==1&&!vis[i])
		{
			vis[i]=1;
			dfs(i);
			
		}
	
	}
	
}
int main()
{
	int i,j;
	int l;
	char str[100];
	flag=0;
	memset(map,0,sizeof(map));
	memset(vis,0,sizeof(vis));
	while(cin>>str)
	{
		if(str[0]=='0')
		{		
			dfs(s);
			if(flag)
				printf("Yes.\n");
			else
				printf("No.\n");
			flag=0;
			memset(map,0,sizeof(map));
			memset(vis,0,sizeof(vis));
			continue;
		}
		else
		{
			l=strlen(str);
			map[str[0]-'a'][str[l-1]-'a']=1;
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值