乙個無環的有向圖稱為無環圖(
directed acyclic graph
),簡稱
dag圖。
aoe(activity on edge)網:顧名思義,用邊表示活動的網,當然它也是dag。與aov不同,活動都表示在了邊上,如下圖所示:
如上所示,共有11
項活動(11
條邊),9
個事件(9
個頂點)。整個工程只有乙個開始點和乙個完成點。即只有乙個入度為零的點(源點)和只有乙個出度為零的點(匯點)。
關鍵路徑:是從開始點到完成點的最長路徑的長度。路徑的長度是邊上活動耗費的時間。如上圖所示,1
到2 到 5
到7到9
是關鍵路徑(關鍵路徑不止一條,請輸出字典序最小的),權值的和為18。
這裡有多組資料,保證不超過10
組,保證只有乙個源點和匯點。輸入乙個頂點數n(2<=n<=10000),
邊數m(1<=m <=50000),
接下來m
行,輸入起點sv
,終點ev,
權值w(1<=sv,ev<=n,sv != ev,1<=w <=20)
。資料保證圖連通。
關鍵路徑的權值和,並且從源點輸出關鍵路徑上的路徑(如果有多條,請輸出字典序最小的)。
9 111 2 6
1 3 4
1 4 5
2 5 1
3 5 1
4 6 2
5 7 9
5 8 7
6 8 4
8 9 4
7 9 2
18提示1 22 5
5 77 9
#include
#include
#include
#include
using namespace std;
typedef struct arcnode//表結點
arcnode;
typedef struct vnode//頭結點;
adjlist[10001];
typedef struct//圖的結構
alg;
int n,m,i,j;
int indegree[10001];//記錄每個點的入度
int ve[10001];//最早開始時間;
int vl[10001];//最遲開始時間;
void create(alg &g)//建立有向圖鄰接表;
}stacks;//用於逆拓撲有序時求vl;
int topo1(alg &g)//求ve(最早開始時間即最大路徑長度);
}if(countnext)
}int flag=0,a,b;
for(j=1;j<=n;j++)//求關鍵活動;
for(p=g.a[j].first;p;p=p->next)
else if(a==j&&b>k)
b=k;
else if(b==j)//結束活動的分支時b作為活動的開始時。}}
printf("%d %d\n",a,b);
return 1;
}int main()
return 0;
}#include
using namespace std;
struct edgep[50086];
int n,m,next[10086],head[50086],cnt,vis[10086],dis[10086],i,u,v,w;
int main()
queueq;
q.push(n);
while(!q.empty())}}
printf("%d\n",dis[1]);//輸出最長路徑的長度
for(i=1;next[i];i=next[i])//輸出1-n的最長路徑
printf("%d %d\n",i,next[i]);
}return 0;
}
AOE網上的關鍵路徑
求關鍵路徑 1 輸入e條弧,建立aoe 網的儲存結構 2 從源點v0出發,令ve 0 0,按拓撲有序求其各頂點的最早發生時間ve i 1 i n 1 如果得到的拓撲有序序列中頂點個數小於頂點數n,則說明網中存在環,不能求關鍵路徑,演算法終止 否則執行步驟 3 3 從匯點vn出發,令vl n 1 ve...
AOE網上的關鍵路徑
time limit 1000ms memory limit 65536k 乙個無環的有向圖稱為無環圖 directed acyclic graph 簡稱 dag圖。aoe activity on edge 網 顧名思義,用邊表示活動的網,當然它也是dag。與aov不同,活動都表示在了邊上,如下圖所...
AOE網上的關鍵路徑
乙個無環的有向圖稱為無環圖 directed acyclic graph 簡稱 dag圖。aoe activity on edge 網 顧名思義,用邊表示活動的網,當然它也是dag。與aov不同,活動都表示在了邊上,如下圖所示 如上所示,共有11 項活動 11 條邊 9 個事件 9 個頂點 整個工程...