| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1541 人关注过本帖
标题:求最短路径问题
取消只看楼主 加入收藏
hf201089
Rank: 2
等 级:论坛游民
帖 子:48
专家分:25
注 册:2012-3-4
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
求最短路径问题
图片附件: 游客没有浏览图片的权限,请 登录注册

我在网上找到的解答是这样的思想:
创建两个表,OPEN, CLOSE。   
OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。   
1. 访问路网中距离起始点最近且没有被检查过的点,把这个点放入OPEN组中等待检查。   
2. 从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中。   
3. 遍历考察这个点的子节点。求出这些子节点距起始点的距离值,放子节点到OPEN表中。   
4. 重复第2和第3步,直到OPEN表为空,或找到目标点。
找V0到V5的最短路径
但有个地方想不通,找到V4的时候再往下找有2种到V3和到V5如果按照它所说的那么是不是就找到V3了?
那如果V3到V5之间的距离为10呢?那么10+3不是>6了吗?
搜索更多相关主题的帖子: 检查 
2012-04-05 17:46
hf201089
Rank: 2
等 级:论坛游民
帖 子:48
专家分:25
注 册:2012-3-4
收藏
得分:0 
回复 2楼 cuijunchao
我问的那个图是离散书上的
具体的题目是http://acm.hdu.
我想问的是具体的思想
2012-04-05 21:33
hf201089
Rank: 2
等 级:论坛游民
帖 子:48
专家分:25
注 册:2012-3-4
收藏
得分:0 
回复 7楼 寒风中的细雨
程序代码:
v0        v1              v2                 v3                     v4                v5

0         {v0,v1},1       {v0,v2},4          oo                     oo                oo    ->{v0, v1}

           0              {v0,v1,v2},3       {v0,v1,v3},8          {v0,v1,v4},6       oo    ->{v0,v1,v2}

                          0                  {v0,v1,v3},8          {v0,v1,v2,v4},4    oo    ->{v0,v1,v2,v4}
        
                                             {v0,v1,v2,v4,v3},7      0                {v0,v1,v2,v4,v5},10     ->{v0,v1,v2,v4,v3}

                                             0                                       {v0,v1,v2,v4,v3,v5},9   ->end

                                                                                     0    
我想问的是如果V3->V5的距离不是2,而是10的话,那么到V3 {v0,v1,v2,v4,v3},7 后只能寻找V5只能利用7+10了吗?
这么以来不是大于 {v0,v1,v2,v4,v5},10     了吗?
2012-04-06 09:33
hf201089
Rank: 2
等 级:论坛游民
帖 子:48
专家分:25
注 册:2012-3-4
收藏
得分:0 
回复 9楼 寒风中的细雨
当找到V4时,只能找到与它相邻的两个点V3和V5吗?
试探性的查找不是找与它相邻的最短距离的吗?
能发散到下一个结点的下一个结点吗?
那么这样的话怎么知道V4-V3-V5 和V4-V5谁大谁小呢?
2012-04-06 13:07
hf201089
Rank: 2
等 级:论坛游民
帖 子:48
专家分:25
注 册:2012-3-4
收藏
得分:0 
回复 11楼 寒风中的细雨
能不能再帮我看看这代码
这是HDU 1874的一道题 http://acm.hdu.
代码如下
程序代码:
#include<stdio.h> 
#include<string.h> 
#define M 205 
#define INF 0xfffffff 

 
int dis[M]; 
int G[M][M]; 
int que[M*M]; 
bool v[M]; 
int n,m; 

 
int min(int a,int b) 
{ 
    if(a<b) return a; 
    return b; 
} 

 
void SPFA(int u) 
{ 
    int l=0,r=0; 
    int i,p; 
    memset(v,false,sizeof(v)); 
    for(i=0;i<n;i++) 
        dis[i]=INF; 
    que[r++]=u; 
    dis[u]=0; 
    v[u]=true; 
    while(l<r)                              //这里的r不是等于1的吗?怎么进行运行呢?
    { 
        p=que[l++]; 
        v[p]=false; 
        for(i=0;i<n;i++) 
            if( dis[i]>dis[p]+G[p][i]) 
            { 
                dis[i]=dis[p]+G[p][i]; 
                if(!v[i]) 
                { 
                    v[i]=true; 
                    que[r++]=i; 
                } 
            } 
    } 
} 

 
int main() 
{ 
    int i,j; 
    int s,t; 
    while(scanf("%d%d",&n,&m)!=EOF) 
    { 
        for(i=0;i<n;i++) 
            for(j=0;j<n;j++) 
                G[i][j]=INF; 
        while(m--) 
        { 
            int a,b,c; 
            scanf("%d%d%d",&a,&b,&c); 
            G[a][b]=G[b][a]=min(G[a][b],c); 
        } 
        scanf("%d%d",&s,&t); 
        SPFA(s); 
        if(dis[t]!=INF) 
            printf("%d\n",dis[t]); 
        else printf("-1\n"); 
    } 
    return 0; 
} 
你所说的试探性比较是在哪段代码怎么实现的呢?
再麻烦你一次了
还有其中有个 while(l<r)  此时r不是等于1吗?不会执行下面的代码的吧?
2012-04-06 20:25
hf201089
Rank: 2
等 级:论坛游民
帖 子:48
专家分:25
注 册:2012-3-4
收藏
得分:0 
自己帮顶下
2012-04-07 09:02
hf201089
Rank: 2
等 级:论坛游民
帖 子:48
专家分:25
注 册:2012-3-4
收藏
得分:0 
回复 15楼 寒风中的细雨
非常感谢,我仔细拜读去了!
2012-04-07 18:25
快速回复:求最短路径问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044232 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved