| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 988 人关注过本帖
标题:一个求关键路径的码 -,- 谁帮俺看下
只看楼主 加入收藏
菜鸟选手
Rank: 1
等 级:新手上路
帖 子:132
专家分:0
注 册:2008-5-5
收藏
 问题点数:0 回复次数:5 
一个求关键路径的码 -,- 谁帮俺看下
问题被自己解决.!

[[it] 本帖最后由 菜鸟选手 于 2008-5-11 10:35 编辑 [/it]]
搜索更多相关主题的帖子: 路径 关键 
2008-05-10 22:48
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
我在看你的测试数据呢...可以给我看看啊...刚看到拓扑序列..你就删了

学习需要安静。。海盗要重新来过。。
2008-05-11 10:54
菜鸟选手
Rank: 1
等 级:新手上路
帖 子:132
专家分:0
注 册:2008-5-5
收藏
得分:0 
#include <iostream>
#include <stack>
using namespace std;
const int MAX=100;
int ve[MAX]={0},vl[MAX]={0}; //最早发生时间ve,最迟发生时间vl.
int vexnum;      

class Graph{            
    public:
        Graph();
        ~Graph();
        bool TopologicalSort();
        void CriticalPath();
        
    private:
        typedef struct ArcNode{
            int adjvex;
            ArcNode *next;
            int info;          //权值
        }ArcNode;
        ArcNode *p;
        typedef struct Vnode{
            char data;
            ArcNode *firstarc;
        }Vnode;
        Vnode AdjList[MAX];
        int D[MAX];   //D储存所有结点的入度值,
        stack<int>S,T;
};
   
Graph::Graph(){
    cout<<"Please input node numbers[<100] : ";
    cin>>vexnum;
    int i,j=0,k=0;
    for(i=0,j=65;i<vexnum;++i,++j)
    {
        D[i]=0;
        AdjList[i].data=j;    //A,B,C,D,E,F;
        AdjList[i].firstarc=NULL;
    }
    cout<<"Node was initializated(For Example:A(0),B(1),C(2).....)."<<endl;
    cout<<"Input arcinfo(For Example:0 1 10),if stop input,input EOF: "<<endl;
    while(cin>>i>>j>>k)
    {
        p=new ArcNode;
        p->adjvex=j;
        p->info=k;
        p->next=AdjList[i].firstarc;
        AdjList[i].firstarc=p;
        ++D[j];
    }
}

Graph::~Graph(){
    int i;
    for(i=0;i<vexnum;++i)
    {
        while(AdjList[i].firstarc)
        {
            p=AdjList[i].firstarc;
            AdjList[i].firstarc=p->next;
            delete p;
        }
    }
    system("pause");
}
   
bool Graph::TopologicalSort(){
    cout<<"Topolagical sort is: ";
    int i,count=0,k,j;
    for(i=0;i<vexnum;++i)
        if(!D[i])
           S.push(i);
    while(!S.empty())
    {
        j=S.top();               
        T.push(j);    //保存拓扑序列
        S.pop();
        cout<<AdjList[j].data<<" ";
        ++count;
        for(p=AdjList[j].firstarc;p;p=p->next)
        {                          //求最早发生时间
            k=p->adjvex;
            if(!(--D[k])) S.push(k);
            if(ve[j]+p->info>ve[k]) ve[k]=ve[j]+p->info;
        }
    }
    if(count<vexnum)
    return false;
    else
    return true;
}

void Graph::CriticalPath(){
    cout<<endl;
    int i,j,k,dut=0,ee,el;
    j=ve[0];
    for(i=1;i<vexnum;++i)
        if(ve[i]>j)               
           j=ve[i];
    for(i=0;i<vexnum;++i)
        vl[i]=j;
    while(!T.empty())
    {
        j=T.top();
        T.pop();
        for(p=AdjList[j].firstarc;p;p=p->next)
        {
            k=p->adjvex;
            dut=p->info;
            if(vl[k]-dut<vl[j])     //求最迟发生时间
               vl[j]=vl[k]-dut;
        }
    }
    for(j=0;j<vexnum;++j)
        for(p=AdjList[j].firstarc;p;p=p->next)
        {
            k=p->adjvex;
            dut=p->info;        //得到关键路径
            ee=ve[j];
            el=vl[k]-dut;
            if(ee==el)
               cout<<j<<" --> "<<k<<",["<<dut<<"],"<<ee<<","<<el<<" *."<<endl;
        }
}

int main(){
    Graph G;
    if(G.TopologicalSort())
       G.CriticalPath();
    else
        cout<<"\nTopolagical sort is fail.The Graph is loop."<<endl;     
   
    return 0;
}
   
/*Please input node numbers[<100] : 9
Node was initializated(For Example:A(0),B(1),C(2).....).
Input arcinfo(For Example:0 1 10),if stop input,input EOF:
0 1 6
0 2 4
0 3 5
1 4 1
2 4 1
4 6 9
4 7 7
3 5 2
5 7 4
6 8 2
7 8 4
^Z
Topolagical sort is: A B C E G D F H I
0 --> 1,[6],0,0 *.
1 --> 4,[1],6,6 *.
4 --> 7,[7],7,7 *.
4 --> 6,[9],7,7 *.
6 --> 8,[2],16,16 *.
7 --> 8,[4],14,14 *.
请按任意键继续. . .
*/   
对的贴出来 ,早上起来后 改的!

算法学习群57909089
2008-05-11 12:40
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
兄弟借你代码用下..谢谢
#include <iostream>
#include <stack>
using namespace std;
const int MAX=100;
int ve[MAX]={0},vl[MAX]={0}; //最早发生时间ve,最迟发生时间vl.
int vexnum;      

class Graph{            
    public:
        Graph();
        ~Graph();
        bool TopologicalSort();
        void CriticalPath();
        
    private:
        typedef struct ArcNode{
            int adjvex;
            ArcNode *next;
            int info;          //权值
        }ArcNode;
        ArcNode *p;
        typedef struct Vnode{
            char data;
            ArcNode *firstarc;
        }Vnode;
        Vnode AdjList[MAX];
        int D[MAX];   //D储存所有结点的入度值,
        stack<int>S,T;
};
   
Graph::Graph(){
    cout<<"Please input node numbers[<100] : ";
    cin>>vexnum;
    int i,j=0,k=0;
    for(i=0,j=65;i<vexnum;++i,++j)
    {
        D[i]=0;
        AdjList[i].data=j;    //A,B,C,D,E,F;
        AdjList[i].firstarc=NULL;//建立邻接表的头接点
    }
    cout<<"Node was initializated(For Example:A(0),B(1),C(2).....)."<<endl;
    cout<<"Input arcinfo(For Example:0 1 10),if stop input,input EOF: "<<endl;
    while(cin>>i>>j>>k)
    {
        p=new ArcNode;
        p->adjvex=j;
        p->info=k;
        p->next=AdjList[i].firstarc;
        AdjList[i].firstarc=p;
        ++D[j];
    }//建立从i->j邻接表,并把j得入度加一
}

Graph::~Graph(){
    int i;
    for(i=0;i<vexnum;++i)
    {
        while(AdjList[i].firstarc)
        {
            p=AdjList[i].firstarc;
            AdjList[i].firstarc=p->next;
            delete p;
        }
    }
    system("pause");
}
   
bool Graph::TopologicalSort(){
    cout<<"Topolagical sort is: ";
    int i,count=0,k,j;
    for(i=0;i<vexnum;++i)
        if(!D[i])
           S.push(i);//拓扑图的入度为0得点如栈
    while(!S.empty())
    {
        j=S.top();               
        T.push(j);    //保存拓扑序列
        S.pop();
        cout<<AdjList[j].data<<" ";
        ++count;
        for(p=AdjList[j].firstarc;p;p=p->next)
        {                          //求最早发生时间
            k=p->adjvex;
            if(!(--D[k])) S.push(k);
            if(ve[j]+p->info>ve[k]) ve[k]=ve[j]+p->info;
            //cout<<k;
        }
    }
    /*
           1-2-3-+
           2-5-+
           3-4-+
           4-6-+
           5-6-+
           6-+
      我建立这样的例子,可以模拟入栈顺序:
      1-2-3-4-5-6
      出栈为:
      1-3-4-2-5-6
      不难发现,这个拓扑图有两个路径到6,1-3-4-6和1-2-5-6而且到的顺序也和前面一样
      带入分析代码,可以得到,这是个加权的路,并且要保证没个接点都是路径中最长时间,
      如1-3-4-6为t1,1-2-5-6为t2。如果t2>t1..那么ve[6]=t2;这是个递推的过程..对没个点
      都是这样的过程;
    */
    if(count<vexnum)
    return false;
    else
    return true;
}

void Graph::CriticalPath(){
    cout<<endl;
    int i,j,k,dut=0,ee,el;
    j=ve[0];
    for(i=1;i<vexnum;++i)
        if(ve[i]>j)               
           j=ve[i];//找出终点的最早发生时间
    for(i=0;i<vexnum;++i)
        vl[i]=j;
    while(!T.empty())
    {
        j=T.top();
        T.pop();
        for(p=AdjList[j].firstarc;p;p=p->next)
        {
            k=p->adjvex;
            dut=p->info;
            if(vl[k]-dut<vl[j])     //求最迟发生时间
               vl[j]=vl[k]-dut;
        }
    }
    /*
        还用上面的例子
           1-2-3-+
           2-5-+
           3-4-+
           4-6-+
           5-6-+
           6-+
      我建立这样的例子,可以模拟入栈顺序:
      1-2-3-4-5-6
      出栈为:
      1-3-4-2-5-6
      上面是s的出栈顺序,也是T得入栈顺序
      j表示当前接点,k表示和当前接点成弧得下一接点.
      先出栈的是6,6-+,
      接着是   5, 5-6-+,
      .......  2,2-5-+,
               4,4-6-+,
               3,3-4-+,
               1,1-2-3-+,
       得到最迟发生时间..
    */
    for(j=0;j<vexnum;++j)
        for(p=AdjList[j].firstarc;p;p=p->next)
        {
            k=p->adjvex;
            dut=p->info;        //得到关键路径
            ee=ve[j];
            el=vl[k]-dut;
            if(ee==el)
               cout<<j<<" --> "<<k<<",["<<dut<<"],"<<ee<<","<<el<<" *."<<endl;
        }
}    //因为关键路径的最早发生时间和最迟发生时间一致..所以可以推出关键路径....

int main(){
    Graph G;
    if(G.TopologicalSort())
       G.CriticalPath();
    else
        cout<<"\nTopolagical sort is fail.The Graph is loop."<<endl;     
   
    return 0;
}

学习需要安静。。海盗要重新来过。。
2008-05-11 16:30
菜鸟选手
Rank: 1
等 级:新手上路
帖 子:132
专家分:0
注 册:2008-5-5
收藏
得分:0 
大哥你要说什么?
 不明白e ..难道是在讲课 are you a teacher?

算法学习群57909089
2008-05-11 19:48
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
呵呵..我分析下..并不是大家都看的懂哦...你很强了...呵呵
{j=ve[0];
    for(i=1;i<vexnum;++i)
        if(ve[i]>j)               
            j=ve[i];}
可以改写成j=ve[T.top()];

[[it] 本帖最后由 sunkaidong 于 2008-5-11 20:12 编辑 [/it]]

学习需要安静。。海盗要重新来过。。
2008-05-11 19:49
快速回复:一个求关键路径的码 -,- 谁帮俺看下
数据加载中...
 
   



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

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