算法题,求大牛给个详解

TBNoO 2012-12-04 08:23:55
输入一张图:


说明:边的数值代表从A到B的代价;

输出:从a到G的路线,要求,代价最小:

求解:算法:
1
先随便输出5条路径:
比如:abeg adbeg adfg abceg adefg
2,计算每条路径的健康度:也就是花费:
比如:abeg=7+7+9;
3,选出5条中最健康的4条。两两进行交配。

交配就是如果有相同节点,则交换路径:
比如:
abc d efg
afscv d fdsg

他们俩交换以后是
afscv d efg
abc d fdsg

然后在计算这四条的健康度。

以此类推。直到只有一条

...全文
133 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
breakfisher 2012-12-04
  • 打赏
  • 举报
回复
引用 2 楼 badyflf 的回复:
能否给个具体的答案 引用 1 楼 breakfisher 的回复:动态规划求解
参考这篇博客的内容吧 http://blog.sina.com.cn/s/blog_4def2d3d0100arwb.html
newtee 2012-12-04
  • 打赏
  • 举报
回复
谷歌迪杰斯特拉算法
newtee 2012-12-04
  • 打赏
  • 举报
回复
参考迪杰斯特拉算法
#include<stdio.h>
#include<stdlib.h>
#define MAXINT 5000
#define VEX_NUM 7
#define ARC_NUM 10
typedef struct{
	char vexs[VEX_NUM];
	int arcs[VEX_NUM][VEX_NUM];
	}Mgraph;
void creat_Mgraph(Mgraph *G);
void Dijkstra(Mgraph Gn,int v,int path[],int dist[]);
void Putpath(int v,int p[],int d[]);
void printpath(int v,int u,int p[],int d[]);
main()
{
        char city[7][20]={"beijing","xian","zhengzhou","xuzhou","chengdu","guangzhou","shanghai"};
	Mgraph Gn;
	int i,m,n;
	int path[VEX_NUM],dist[VEX_NUM];
	char s[4];
	for(;;)
	{
		printf("1.建立交通图的存储结构\n");
		printf("2.求某城市到所有城市的最短路径\n");
		printf("3.求任意两个城市之间的最短路径\n");
		printf("4.退出\n");
        gets(s);
		switch(*s)
		{
		  case'1':creat_Mgraph(&Gn);
			  break;
		  case'2':printf("请输入城市:\n");
			  scanf("%d",&i);
			  Dijkstra(Gn,i,path,dist);
			  Putpath(i,path,dist);
			  break;
		  case'3':printf("请输入城市:\n");
			  scanf("%d,%d",&m,&n);
			  Dijkstra(Gn,m,path,dist);
			  printpath(m,n,path,dist);
			  break;
		  case'4':exit(0);
			  break;
		}
	}
}
void creat_Mgraph(Mgraph *G)
{
		int i,j,k,w;
		printf("\n inuput vextex:");
		for(i=0;i<VEX_NUM;i++)
		     scanf("%c",&G->vexs[i]);
		for(i=0;i<VEX_NUM;i++)
		for(j=0;j<VEX_NUM;j++)
		     G->arcs[i][j]=MAXINT;
		printf("\n input edge(i,j,w):\n");
		for(k=1;k<=ARC_NUM;k++)
		{
		    scanf("%d,%d,%d",&i,&j,&w);
		    G->arcs[i][j]=w;
		    G->arcs[j][i]=w;
		}
}
void Putpath(int v,int p[],int d[])
{
		int i,j,next;
		for(i=0;i<VEX_NUM;i++)
		  if(d[i]<MAXINT&&i!=v)
		  {
			printf("%c<--",city[i]);
			next=p[i];
			while(next!=v)
			{
			    printf("%c<--",city[next]);
			    next=p[next];
			}
		    printf("%c:%d\n",city[v],d[i]);
		  }
}
void printpath(int v,int u,int p[],int d[])
{
     int i,j,next;
     for(i=0;i<VEX_NUM;i++)
	if(d[i]<MAXINT&&i==u)
        {  
            printf("%c<--",city[i]);
            next=p[i];
            while(next!=v)
            {  
                 printf("%c<--",city[next]);
	         next=p[next];
            }
	         printf("%c:%d\n",city[v],d[i]);
        }
}
         
void Dijkstra(Mgraph Gn,int v,int path[],int dist[])
{
	int i,j,w,k,min;
	int s[VEX_NUM];
	for(j=0;j<VEX_NUM;j++)
	{
		s[j]=0;
		dist[j]=Gn.arcs[v][j];
		if(dist[j]<MAXINT)
			path[j]=v;
		else
			path[j]=-1;
	}
	dist[v]=0;
	s[v]=1;
	for(i=0;i<VEX_NUM;i++)
	{
		min=MAXINT;
		for(w=0;w<VEX_NUM;w++)
			if(!s[w]&&dist[w]<min)
			{
				j=w;
				min=dist[w];
			}
			s[j]=1;
			for(k=0;k<VEX_NUM;k++)
				if(!s[k]&&(min+Gn.arcs[j][k]<dist[k]))
				{
					dist[k]=min+Gn.arcs[j][k];
					path[k]=j;
				}
	}
}
TBNoO 2012-12-04
  • 打赏
  • 举报
回复
能否给个具体的答案
引用 1 楼 breakfisher 的回复:
动态规划求解
breakfisher 2012-12-04
  • 打赏
  • 举报
回复
动态规划求解

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧