中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
算法连载(5)--动态规划之allPath
作者:未知 时间:2005-07-27 23:18 出处:CSDN 责编:chinaitpower
              摘要:算法连载(5)--动态规划之allPath

1.问题描述:设G=(V,E)是一个有N个结点的有向图。又设C是G是成本邻接矩阵,其中C(i,i)=0,1<=i<=n;当<i,j>属于E(G)时,C(i,j)表示边<i,j>的成本;当i不等于j且<i,j>不属于E(G)时,C(i,j)等于无穷(用一个较大的数表示)。求出每对结点之间的最短路径。

2.设计思想与分析:
    基本思路:首先决策哪个结点是该路径上的具有最大编号的中间结点K,然后就再去求取由I到K和由K到J这对结点间的最短路径,再把中间结点K记录下来。若是结点I,J间不用经过其他结点就能得到最短路径则把本身的成本保留下来,且不记录中间结点。

(本设计的遍历有问题,不能遍历经过2个结点的路径,一直没有修改。)

#include <iostream.h>
int const m=4;

struct node
{
 int flag[m];  //用来记录每对结点最短路径要经过的结点
 float cost;  //用来记录结点到结点的路径成本
};

void all_paths(node COST[m][m],node A[m][m],int n)
{
 int i,j,k;
//复制带路径成本的邻接矩阵
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
  {
   A[i][j].cost=COST[i][j].cost;
   for(k=0;k<n;k++)
   A[i][j].flag[k]=0;
  }

//*运用动态规划的的部分,核心算法*//
  
  for(k=0;k<n;k++)//对最高下标为K的结点的路径
  {
   for(i=0;i<n;i++)   //对于所有可能结点对
   
    for(j=0;j<n;j++)
    {
     if(A[i][j].cost>(A[i][k].cost+A[k][j].cost))
     {
      A[i][j].cost=(A[i][k].cost+A[k][j].cost);
      A[i][j].flag[k]=k+1;  //记录要经过的结点编号
     }
     else A[i][j].cost=A[i][j].cost;
         
    }
   
   
  }


 for(i=0;i<n;i++)
 {
  for(j=0;j<n;j++)
  { 
   
   if(i!=j)
   { if(A[i][j].cost==100)
    cout<<i+1<<"号结点无法到达"<<j+1<<"号结点"<<endl;
      else
      {
       cout<<i+1<<"号结点到"<<j+1<<"号结点的最小路径成本为:"<<A[i][j].cost<<endl;
       cout<<"其路径为:"<<i+1<<"->";
          for(k=0;k<n;k++)
       {
        if(A[i][j].flag[k]!=0)
      cout<<A[i][j].flag[k]<<"->";
       }
       cout<<j+1<<endl<<endl;
      }
   }
   else cout<<endl;
  }
  
 }

}

void main()
{   cout<<"|--------每对结点之间的最短路径-------|"<<endl;
 cout<<"|---ower by zhanjiantao(028054115)---|"<<endl;
 cout<<"|-------------------------------------|"<<endl<<endl;
 cout<<"注意:请不要输入大于100的成本,本身到本身输入0,输入100表示无法到达"<<endl;
   int i,j,n,k;
   struct node COST[m][m];
   struct node A[m][m];
   while(k)
   {
  cout<<"结点总数为三个,请你构造这个图。"<<endl<<endl;
   //cin>>n;
  n=3;
  for(i=0;i<n;i++)
   for(j=0;j<n;j++)
   {
    cout<<"请输入"<<i+1<<"号结点到第"<<j+1<<"号结点的路径成本:";
    cin>>COST[i][j].cost;
   };

  all_paths(COST,A,n);
  cout<<"Press<1> to run again"<<endl;
  cout<<"Press<0> to exit"<<endl;
  cin>>k;
   }
}


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有