# include & ltstdlib.h & gt
# include & ltmalloc.h & gt
#定義最大20
Typedef struct node //定義AOV網鄰接鏈表的邊節點結構有向圖。
{
int vex//邊緣節點
結構節點* next//指向邊緣節點的指針
} edgenode
Typedef struct vnode //定義AOV網相鄰鏈表的邊節點結構的有向圖。
{
int id//穿透力
結構節點*鏈接;//頂點的指針
} vexnode
Typedef struct nodel //定義AOE網鄰接表的邊節點結構。
{
int adgvex//邊緣節點
int dut//重量
struct nodel * next//邊緣節點指針
} edgenodel
typedef struct v model//定義AOE網鄰接表的邊節點結構。
{
int頂點;//頂點
int id//穿透力
struct nodel * link//頂點的指針
} vexnodel
int na
//函數聲明
int creata OE(vex nodel dig[]);
int creata ov(vex node dig[]);
void toposort(vexnode dig[],int n);
void criticalpath(vexnodel dig[],int n);
void main()
{
vexnodel dig[max];//AOV的頂點數組
vex node dig 2[max];//AOE頂點數組
int n = 0;
int cord = 1;
while(1)
{
cout & lt& lt"-主菜單-"
cout & lt& lt"1.建立AOV鄰接表”
cout & lt& lt"2.建立AOE鄰接表”
cout & lt& lt"3.拓撲排序”
cout & lt& lt"4.找到關鍵路徑”
cout & lt& lt"0.退出"
cout & lt& lt"輸入您的選擇:"
CIN & gt;& gt軟線;
開關(電線)
{
案例1:n = creata ov(dig 2);
打破;
案例2:cout & lt;& lt”輸入邊數:“;
CIN & gt;& gtna;//AOE網絡的活動次數
n = creata OE(dig);
打破;
案例三:toposort(dig2,n);
打破;
案例4:criticalpath(dig,n);//找到關鍵路徑
打破;
案例0:出口(0);
}
}
}
int creatAOE(vexnodel dig[])
{
int vextotal,j,a,b,c;
edge nodel * p;
cout & lt& lt”輸入頂點數:“;
CIN & gt;& gtvextotal//輸入頂點的數量。
for(j = 0;j & ltmaxJ++) //進入AOE鄰接表。
{
挖[j]。頂點= j;//初始化頂點數組
挖[j]。id = 0;
挖[j]。link = NULL//頂點的指針
}
for(j = 1;j & lt= naj++)
{
cout & lt& lt“輸入邊緣
CIN & gt;& gta & gt& gtb & gt& gtc;//a是初始頂點,B是最終頂點,C是活動的權重。
挖[b]。id++;//滲透加壹。
p =(edge nodel *)malloc(sizeof(edge nodel));
p->;adg vex = b;
p->;dut = c;
p->;下壹個=挖[a]。鏈接;
挖。link = p;
}
cout & lt& lt“輸出鄰接表”endl
//進入AOV圖的鄰接表。
for(j = 1;j & lt= vextotalj++)
{
cout & lt& lt"頂點" < & ltj & lt& lt“滲透是”
p=dig[j]。鏈接;//頂點指針下移
而(p!=0)
{
cout & lt& lt"頂點" < & ltp->;adgvex & lt& lt“重量是”
p = p-& gt;接下來;
}
cout & lt& ltendl
}
返回vextotal
}
int creatAOV(vexnode dig[])
{
int vextotal,arcnumber,j,a,b;
edge node * p;//邊緣節點結構
cout & lt& lt”輸入邊數:“;
CIN & gt;& gtarcnumber
cout & lt& lt”輸入頂點數:“;
CIN & gt;& gtvextotal
//進入AOV圖的鄰接表。
for(j = 0;j & ltmaxJ++) //初始化
{
挖[j]。id = 0;
挖[j]。link = NULL//頂點指針為空
}
for(j = 1;j & lt= arcnumberj++)
{
cout & lt& lt"輸入由兩個頂點表示的邊:"
CIN & gt;& gta & gt& gtb;//輸入邊信息,其中A是起始頂點,B是最終頂點。
p =(edge node *)malloc(sizeof(edge node));
p->;vex = b;
p->;下壹個=挖[a]。鏈接;
挖。link = p;
挖[b]。id++;//滲透率加1
}
cout & lt& lt“輸出鄰接表”endl//進入AOV圖的鄰接表。
for(j = 1;j & lt= vextotalj++)
{
cout & lt& lt"頂點" < & ltj & lt& lt“滲透程度”
p=dig[j]。鏈接;//指針向下移動
而(p!=空)
{
cout & lt& lt"頂點" < & ltp->;vex & lt& lt" ";
p = p-& gt;接下來;
}
cout & lt& ltendl
}
返回vextotal
}
Void toposort (vexnodedig [],int n)//拓撲排序
{
edge node * p;
int i,j,k,top,m;
top = 0;
m = 0;
//cout & lt;& lt" ssss " & lt& ltn;
for(I = 1;我& lt= n;i++)
如果(挖[我]。id==0) //鏈入度為0的頂點。
{
挖[我]。id = top
top = I;
}
while(top & gt;0)
{
j =頂部;
top =挖【頂】。id;
cout & lt& ltj & lt& lt" ";//輸出入度為0的頂點。
m++;//計算零滲透的頂點。
p=dig[j]。鏈接;
而(p!=空)
{
k = p-& gt;vex
挖[k]。id-;
如果(挖[k]。id==0)
{
挖[k]。id = top
top = k;
}
p = p-& gt;接下來;
}
}
cout & lt& ltendl
如果(m & ltn)
cout & lt& lt“網絡有無環”& lt& ltendl
}
Void關鍵路徑(vexnodedig [],int n)//找到關鍵路徑。
{
//ve和vl是頂點事件的最早和最晚時間。
//e和L是活動的最早和最晚時間。
int front=0,rear = 0;
int tpord[20],vl[20],ve[20];
int l[20],e[20],I,j,k,m;
edge nodel * p;
for(I = 1;我& lt= n;i++)
ve[I]= 0;//將初始值賦給時間的最早發生時間。
for(I = 1;我& lt= n;I++) //將所有條目為0的放入團隊。
如果(挖[我]。id==0)
tpord[++ rear]= I;
m = 0;
而(前面!=後部)
{
front++;
j = tpord[front];
m++;//用於判斷是否存在有向環。
p=dig[j]。鏈接;//指針向下移動
while(p)
{
k = p-& gt;adgvex
挖[k]。id-;//頂點的穿透力減少1。
if(ve[j]+p-& gt;dut & gtVe[k]) //最早時間最大,ve[]初始為0。如果不止壹個,就比較壹下。
ve[k]= ve[j]+p-& gt;dut
如果(挖[k]。id==0)
tpord[++ rear]= k;
p = p-& gt;接下來;
}
}
如果(m & ltN) //判斷是否存在有向環。
cout & lt& lt“AOE網絡有阿昔洛韋”& lt& ltendl
for(I = 1;我& lt= n;I++) //給最晚發生時間賦壹個初始值。
VL[I]= ve[n];
for(I = n-1;我& gt=1;I-)//計算最晚發生時間。
{
j = tpord[I];
p=dig[j]。鏈接;//找到vl[]數組的值
while(p)
{
k = p-& gt;adgvex
if((VL[k]-p-& gt;dut)& lt;Vl[j]) //到最晚時間的最小值或初始值。
VL[j]= VL[k]-p-& gt;dut
p = p-& gt;接下來;
}
}
cout & lt& lt"輸出最早和最晚時間"
for(I = 1;我& lt= n;i++)
cout & lt& lt“最早的”
for(j=1,I = 1;j & lt= n;J++,i++) //計算活動的最早和最晚發生時間。
{
p=dig[j]。鏈接;
while(p)
{
k = p-& gt;adgvex
e[I]= ve[j];
l[I]= VL[k]-p-& gt;dut
cout & lt& lt"頂點" < & lt挖[j]。頂點& lt& lt"頂點" < & lt挖[k]。頂點& lt& lt“最早的”
if(l[i]==e[i])
cout & lt& lt“這是壹項關鍵活動”
其他
cout & lt& ltendl
p = p-& gt;接下來;
}
}
cout & lt& lt”關鍵路徑:“;
for(j=1,I = 1;j & lt= n;J++,i++) //計算活動的最早和最晚發生時間。
{
p=dig[j]。鏈接;
while(p)
{
k = p-& gt;adgvex
e[I]= ve[j];
l[I]= VL[k]-p-& gt;dut
if(l[i]==e[i])
cout & lt& lt挖[我]。頂點& lt& lt" ";
p = p-& gt;接下來;
}
}
cout & lt& ltn;
cout & lt& ltendl
}
測試數據
12
九
1 2 4
1 3 2
1 4 5
2 5 2
2 8 6
3 5 5
4 6 4
5 6 3
5 7 2
6 7 4
7 9 5
8 9 3
12
九
1 2
1 3
1 4
2 5
2 8
3 5
4 6
5 6
5 7
6 7
7 9
8 9
自己跑起來很容易。
妳可以問我