旅游规划问题(Dijkstra与Floyd算法)

给出n个城市与m条公路,Start与End城市

求出最短的路径长度 与最低耗费(路径最短优先,路径长度一样耗费低的优先)

输入:

4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20

输出:3 40


//注释掉的是Floyd算法,未注释的是Dijkstra
/*#include<iostream>
using namespace std;
int N,M,Start,End,a,b,c,d;
const int INF=0x3f3f3f3f;
int mp[502][502][2];        //0是距离 1是花费
int main()
{
    cin>>N>>M>>Start>>End;
    ios::sync_with_stdio(0);
    for(int i=0;i<N;i++){           //初始化路径以及花费的数据
        for(int j=0;j<=i;j++){
            mp[i][j][0]=mp[j][i][0]=INF;
            mp[i][j][1]=mp[j][i][1]=INF;
        }
    }
    for(int i=0;i<M;i++)
    {
        cin>>a>>b>>c>>d;
        mp[a][b][0]=mp[b][a][0]=c;
        mp[a][b][1]=mp[b][a][1]=d;
    }
    for(int k=0;k<N;k++){
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(mp[i][k][0]+mp[k][j][0]<mp[i][j][0]||(mp[i][k][0]+mp[k][j][0]==mp[i][j][0]&&mp[i][k][1]+mp[k][j][1]<mp[i][j][1]))
                {
                    mp[i][j][0]=mp[i][k][0]+mp[k][j][0];
                    mp[i][j][1]=mp[i][k][1]+mp[k][j][1];
                }
            }
        }
    }
    cout<<mp[Start][End][0]<<" "<<mp[Start][End][1];
}
*/






#include<iostream>
using namespace std;
int mp1[502][502],mp2[502][502],vis[502],dis[502],cost[502];
int N,M,Start,End,a,b,c,d;
const int INF=0x3f3f3f3f;
//基本思路就是找距离初始结点最近的节点(now),然后对这个几点的所有邻接结点进行判断
//如果dis[now]+mp1[now][next]<dis[next](当然初始化为dis都为最大值) 
//那么就更新dis[next] 
//N个结点都进行一次上述操作 从Start开始 用vis判断是否进行过 
void dijkstra()
{
	vis[Start]=1;		//判断完一个节点后就标记一下  
	for(int i=0;i<N-1;i++)		//把Start不用判断了 对余下的n-1个结点都进行dijkstra  
	{
		int minx=INF,now;				 
		for(int i=0;i<N;i++)		//找与初始结点最近的结点 
		{
			if(!vis[i]&&dis[i]<minx)
			{
				minx=dis[i];
				now=i; 
			} 
		}
		if(minx==INF)break;		//找不到了就退出 
		vis[now]=1;		//标记一下这个节点 
		 //下面就是对这个结点的所有邻接节点进行判断
		 for(int i=0;i<N;i++)
		 {
		 	//如果不相邻距离就是+无穷 所以不用考虑 
		 	if(!vis[i]&&dis[now]+mp1[now][i]<dis[i])	//如果路径更短就更新 
		 	{
		 		dis[i]=mp1[now][i]+dis[now];
		 		cost[i]=mp2[now][i]+cost[now];
			}	//如果路径长度相同但是花费更短就更新 
			else if(!vis[i]&&dis[i]==dis[now]+mp1[now][i]&&cost[now]+mp2[now][i]<cost[i])
			{
				cost[i]=cost[now]+mp2[now][i];
			}
		 } 
	}
} 
int main()
{
	cin>>N>>M>>Start>>End;
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
		{
			mp1[i][j]=mp1[j][i]=INF;		//初始化距离都是最大值 
			mp2[i][j]=mp2[j][i]=INF;
		}
	}
	for(int i=0;i<M;i++)
	{
		cin>>a>>b>>c>>d;
		mp1[a][b]=mp1[b][a]=c;				//录入数据 
		mp2[a][b]=mp2[b][a]=d;
	}
	for(int i=0;i<N;i++)
	{
		dis[i]=mp1[Start][i],cost[i]=mp2[Start][i];		//初始化每个结点到起点的花费与路径,以后更改的就是这两个变量 
	}
	dis[Start]=0,cost[Start]=0;
	dijkstra();
	//printf("到终点End的最短路径是:%d 最短路径上的花费是:%d",dis[End],cost[End]); 
	 printf("%d %d",dis[End],cost[End]);
}

Guess you like

Origin blog.csdn.net/qq_52245648/article/details/119831311