新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> We choose to study algorithmic problems,  not because they are easy,  but because they are hard.
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机理论与工程『 算法理论与分析 』 → 請問問Dijkstra問題 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 6164 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 請問問Dijkstra問題 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     coolman2008 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:57
      门派:XML.ORG.CN
      注册:2006/1/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给coolman2008发送一个短消息 把coolman2008加入好友 查看coolman2008的个人资料 搜索coolman2008在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看coolman2008的博客楼主
    发贴心情 請問問Dijkstra問題

    dijkstra怎麼可print出從一黠到另一點的路線,是要印出點,不是全部的weight值....

        public static void Dijkstra(int vertex) {
            int i, j;
            int v = 0;
            double minWeight;
            
            for (j=0;j<VertexNum;j++) {
                smallestWeight[j] = weights[vertex][j];
                weightFound[j] = false;
            }
            
            smallestWeight[vertex] = 0;
            weightFound[vertex] = true;
            
            for (i=0;i<VertexNum-1;i++) {
                minWeight = Max;
                for (j=0;j<VertexNum;j++)
                    if (!weightFound[j])
                        if (smallestWeight[j]<minWeight) {
                            v = j;
                            minWeight = smallestWeight[v];
                        }
                        
                weightFound[v] = true;
                
                for (j=0;j<VertexNum;j++)
                    if (!weightFound[j])
                        if (minWeight + weights[v][j] < smallestWeight[j])
                            smallestWeight[j] = minWeight + weights[v][j];
            }
        }


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/19 22:58:00
     
     heyhelloworld 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:17
      积分:200
      门派:XML.ORG.CN
      注册:2006/2/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给heyhelloworld发送一个短消息 把heyhelloworld加入好友 查看heyhelloworld的个人资料 搜索heyhelloworld在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看heyhelloworld的博客2
    发贴心情 
    设置一个数组来存储从源点最短路径上的当前目标点的前一点就应该可以的
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/6/5 23:41:00
     
     chenapple 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:86
      门派:XML.ORG.CN
      注册:2006/5/31

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给chenapple发送一个短消息 把chenapple加入好友 查看chenapple的个人资料 搜索chenapple在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看chenapple的博客3
    发贴心情 
    我也试过这方面的,不过设置数组的时候,用CONST来确定就比较易,如果要求点(名称)和权值的输入就遇到麻烦,我到现在还实现不了.高手指教啦.
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/6/9 8:12:00
     
     Supremgoooo 帅哥哟,离线,有人找我吗?
      
      
      等级:大四下学期(考上研究生啦!)
      文章:201
      积分:1872
      门派:XML.ORG.CN
      注册:2006/4/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Supremgoooo发送一个短消息 把Supremgoooo加入好友 查看Supremgoooo的个人资料 搜索Supremgoooo在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Supremgoooo的博客4
    发贴心情 
    dijkstra是相对于固定原点的最短路算法,所以其中某一点到另一点的路不一定最短。

    求这个源点到各点最短的路可以用一个数组表示,例如:L[],它长为n,L[i]除记下到第i节点的最短路长度外,还可以加一个pre指针(结构实现),pre用来记下到 i 这点的倒数第二点j,然后再查找L[j]的pre....直到找到源点,最后逆序输出就ok了。对于pre修改的过程可以在算法更新weight处进行,挺方便的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/6/12 14:44:00
     
     cpp 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:2
      积分:100
      门派:XML.ORG.CN
      注册:2006/6/26

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cpp发送一个短消息 把cpp加入好友 查看cpp的个人资料 搜索cpp在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看cpp的博客5
    发贴心情 
    看看这个对你有帮助没?


    //可打印最短路路径
    #include "fstream.h"
    #include "string.h"
    ifstream fin("ural_1072.in");
    const int MAX=1005;
    const int maxint=100000000;
    struct
    {
     int n;
     int q[MAX];
    }inter[MAX];
    int dis[MAX],g[MAX][MAX],marked[MAX],ans[MAX],from[MAX],from_floyd[MAX][MAX];
    int n,s,t;

    void bellman_ford()
    {
     int i,more,j,k,n_ans;
     for (i=0; i<n; i++)
      dis[i]=maxint;
     dis[s]=0;
     memset(from,-1,sizeof(from));
     for (k=0; k<n+2; k++)
     {
      more=0;
      for (i=0; i<n; i++)
       if (dis[i]<maxint)
        for (j=0; j<n; j++)
         if (g[i][j] && dis[i]+g[i][j]<dis[j])
         {
          dis[j]=dis[i]+g[i][j];
          from[j]=i;
          more=1;
         }
      
      for (i=n-1; i>=0; i--)                             //反向松弛一遍
       if (dis[i]<maxint)
        for (j=0; j<n; j++)
         if (g[i][j] && dis[i]+g[i][j]<dis[j])
         {
          dis[j]=dis[i]+g[i][j];
          from[j]=i;
          more=1;
         }
      if (!more)
       break;
     }
     if (more)                                              //判负圈
      cout<<"No shortest path!"<<endl;
     
     if (dis[t]==maxint)
     {
      cout<<"No"<<endl;
      return ;
     }
     
     cout<<"Yes"<<endl;
     i=t;
     n_ans=0;
     do
     {
      ans[n_ans++]=i;
      i=from[i];
     }while (i!=-1);
     
     for (i=n_ans-1; i>0; i--)
      cout<<ans[i]<<' ';
     cout<<ans[0]<<endl;
    }*/
    void dijkstra()
    {
     int i,k,j,minv,n_ans;
     for (i=0; i<n; i++)
      dis[i]=maxint;
     dis[s]=0;
     memset(marked,0,sizeof(marked));
     memset(from,-1,sizeof(from));
     k=s;
     for (i=0; i<n; i++)
     {
      marked[k]=1;
      for (j=0; j<n; j++)
       if (!marked[j] && g[k][j] && dis[k]+g[k][j]<dis[j])
       {
        from[j]=k;
        dis[j]=dis[k]+g[k][j];
       } 
        
      minv=maxint;
     for (j=0; j<n; j++)
       if (!marked[j] && minv>dis[j])
       {
        minv=dis[j];
        k=j;
       }
      if (minv==maxint)
       break;
     }

     if (dis[t]==maxint)
     {
      cout<<"No"<<endl;
      return ;
     }
     cout<<"Yes"<<endl;
     
     i=t;
     n_ans=0;
     do
     {
      ans[n_ans++]=i;
      i=from[i];
     }while (i!=-1);
     
    for (i=n_ans-1; i>0; i--)
      cout<<ans[i]<<' ';
     cout<<ans[0]<<endl;*/
    }

    void printPath(int i,int j)
    {
     if (from_floyd[i][j]==-1)
     {
      cout<<i<<' ';
      return;
     }
     printPath(i,from_floyd[i][j]);
     printPath(from_floyd[i][j],j);
    }

    void floyd()
    {
     int i,j,k,n_ans;
     memset(from_floyd,-1,sizeof(from_floyd));
     
     for (k=0; k<n; k++)                           //g是01矩阵时,用位运算比较快
      for (i=0; i<n; i++)
       for (j=0; j<n; j++)
       {
        g[i][j] |= g[i][k] & g[k][j];      
        from_floyd[i][j]=k;
       }                         
        
     for (k=0; k<n; k++)
      for (i=0; i<n; i++)
       if (g[i][k])
        for (j=0; j<n; j++)
         if (g[k][j] && (!g[i][j] || g[i][j]>g[i][k]+g[k][j]))
         {
          from_floyd[i][j]=k;
          g[i][j]=g[i][k]+g[k][j];
         }

     if (!g[s][t])
     {
      cout<<"No"<<endl;
      return ;
     }
     cout<<"Yes"<<endl;
     
     printPath(s,t);
     if (s!=t)
      cout<<t<<endl;*/ 
    }

    int main()
    {
     int i,j;
     fin>>n;
     for (i=0; i<n; i++)
      for (j=0; j<n; j++)
       fin>>g[i][j];
     fin>>s>>t;
     
     bellman_ford();
     dijkstra();
     floyd();
     return 0;
    }

    ----------------------------------------------
    菜鸟一个,想要多学点算法,多认识点朋友

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/6/26 10:07:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 算法理论与分析 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/20 13:33:05

    本主题贴数5,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    93.750ms