搜索算法

不考虑成本信息,最短路径搜索,了解两种算法floyd,dijkstra

了解几个基本概念:

  1. 邻接举证

floyd

//最短路径搜索

 //floyd算法 算法复杂度n3次方 
  
 /*
 问题描述:
已知n个点,m条边,求1-n的最短路径 
 */ 
#include<cstdio>


using namespace std;

int mapp[1001][1001];
const int INF=1e6;
int n,m;

int x_init()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i==j)
			{
				mapp[i][j]=0;//自己到自己没有距离 
			}
			else
			{
				mapp[i][j]=INF;
			}
		}
	 } 
}

int main()
{
	scanf("%d%d",&n,&m);
	x_init; 
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		mapp[u][v]=w;
		
	}
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(mapp[i][k]+mapp[k][j]<mapp[i][j])
				{
					mapp[i][j]=mapp[i][k]+mapp[k][j];
				}
			}
		}
	}
	printf("%d\n",mapp[1][n]);//输出
	return 0; 
}

测试后输出结果有点问题。当然也要floyd也不能计算负权图,无穷尽你懂

dijkstra

/*
时间复杂度n的平方 
从起点开始,采用贪心策略,每次遍历到最近的邻接节点,直到扩展到终点为止 
*/

#include <cstdio>
using namespace std;

const int INF=1e6;
int n,m;
int mapp[1010][1010];
int dis[1010];
int vis[1010];
int pos;

void dijkstra()
{
	for(int k=1;k<=n;k++)
	{
		int minn=INF,pos;
		for(int i=1;i<=n;i++)
		{
			if(!vis[i]&&dis[i]<minn)//注意这里一定是从1开始的 
			{
				minn=dis[i];
				pos=i;//标记前节点 
			}
		}


		vis[pos]=true;
		for(int i=1;i<=n;i++)
		{
			if(!vis[i]&&dis[i]>dis[pos]+mapp[pos][i])
			{
				dis[i]=dis[pos]+mapp[pos][i];//更新dis值 
			}
		}
	}
	return ;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		mapp[u][v]=w; 
		
	}
	int min;
	dijkstra();
	printf("%d",dis[n]);//dis[n]到终点的距离 
	return 0;
}

代码逻辑没啥问题,但是结果不是预期的。。

posted @ 2023-03-28 21:29  cccjjh  阅读(38)  评论(0)    收藏  举报