bon

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  46 Posts :: 0 Stories :: 12 Comments :: 0 Trackbacks

常用链接

留言簿(2)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

算法描述
topologically_sort()
initialize_single_source()
for each vertex v, taken in topologically sorted order
       do for each edge (v,u)
            do relax(v,u)
end

// shortest single source path on DAG
#include <iostream>
#define MAXN 200
#define INF 0xfffffff

using namespace std;

int list[MAXN][MAXN][2];        // 链接表存储图
int seq[MAXN];                    // 拓扑排序后的节点序列
int deg[MAXN];                    // 出度
int d[MAXN];                    //
int trace[MAXN];
int n;

void initialize_single_source()
{
    
for(int i=1;i<=n;i++)
        d[i]
=INF;
    d[
1]=0;
}


// 对无环图DAG拓扑排序
void topologic_sort()
{
    
int i,j,k,indeg[MAXN],visit[MAXN];
    
//for(i=1;i<=n;i++) degree[i]=deg[i];
    for(i=1;i<=n;i++) indeg[i]=0,visit[i]=0;
    
// 求所有节点的入度
    for(i=1;i<=n;i++)
    
{
        
for(j=0;j<deg[i];j++)
        
{
            indeg[list[i][j][
0]]++;
        }

    }

    
/*
    for(i=1;i<=n;i++) printf("%d ",indeg[i]);
    printf("\n");
    
*/

    
for(i=0;i<n;i++)
    
{
        
for(j=1;j<=n;j++)
        
{
            
if(indeg[j]==0 && visit[j]==0)
            
{
                visit[j]
=1;
                seq[i]
=j;
                
for(k=0;k<deg[j];k++) indeg[list[j][k][0]]--;
                
break;
            }

        }

    }

    
for(i=1;i<=n;i++) printf("%d \n",indeg[i]);
    printf(
"\n");
}


void relax(int i,int j)
{
    
if(d[list[i][j][0]]>d[i]+list[i][j][1])
    
{
        trace[list[i][j][
0]]=i;
        d[list[i][j][
0]]=d[i]+list[i][j][1];
    }

}


void shortest_path_DAG()
{
    
int i,j,k;
    
for(i=0;i<n;i++)
    
{
        
int v=seq[i];
        
for(j=0;j<deg[v];j++)
        
{
            relax(v,j);
        }

    }

    
for(i=1;i<=n;i++) printf("%d distance:%d\n",trace[i],d[i]);
}


void readdata()
{
    
int i,j;
    scanf(
"%d",&n);
    
for(i=1;i<=n;i++)
    
{
        scanf(
"%d",&deg[i]);
        
for(j=0;j<deg[i];j++) scanf("%d%d",&list[i][j][0],&list[i][j][1]);
    }

}


int main()
{
    freopen(
"test.txt","r",stdin);
    readdata();
    topologic_sort();
    initialize_single_source();
    shortest_path_DAG();
    
return 1;
}
posted on 2008-02-01 00:06 bon 阅读(182) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


Google PageRank 
Checker - Page Rank Calculator