Aoe的思路就是,分别求活动的最早发生时间,以及活动的最晚发生时间。
最后通过活动的发生时间求每个路径的最早与最晚发生时间。如果路径的最早发生时间与路径的最晚发生时间相同,那么就输出这个边。
下列代码是关于AOE的一个题目。
题目描述是:
3:求关键路径
查看 提交 统计 提问
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB
描述
求出所给的AOE-网的关键路径。
输入
若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有3个数,分别是该条弧所关联的两个顶点编号和弧的权值
输出
若干个空格隔开的顶点构成的序列(用小写字母)
样例输入
9 11
1 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
7 9 2
8 9 3
样例输出
v1 v2 v5 v7 v9
#include<bits/stdc++.h>
using namespace std;
int el[100];
int ee[100];
int zz[100];
int zw[100];
struct Edge
{
int weight;
Edge(){
weight=0;}
}edge[100][100];
void Aoe(int vertexNum)
{
for(int i=1;i<=vertexNum;i++)
{
int max1=0;
for(int j=1;j<=vertexNum;j++)
{
if(edge[j][i].weight!=0)
{
if(max1<edge[j][i].weight+zz[j])
max1=edge[j][i].weight+zz[j];
}
}
zz[i]=max1;
}
zw[vertexNum]=zz[vertexNum];
for(int i=vertexNum-1;i>=1;i--)
{
int min1=999;
for(int j=vertexNum;j>=1;j--)
{
if(edge[i][j].weight!=0&&zw[j]!=0)
{
if(zw[j]-edge[i][j].weight<min1)
min1=zw[j]-edge[i][j].weight;
}
}
zw[i]=min1;
}
}
int main()
{
int qs[100];
int zd[100];
memset(zz,0,sizeof(zz));
memset(zw,0,sizeof(zw));
int vertexNum,edgeNum;
cin>>vertexNum>>edgeNum;
int from,to,weight;
for(int i=1;i<=edgeNum;i++)
{
cin>>from>>to>>weight;
edge[from][to].weight=weight;
qs[i]=from;
zd[i]=to;
}
Aoe(vertexNum);
int item;
for(int i=1;i<=edgeNum;i++)
{
ee[i]=zz[qs[i]];
el[i]=zw[zd[i]]-edge[qs[i]][zd[i]].weight;
//cout<<zz[i]<<endl;
if(ee[i]==el[i])
{
item=i;
cout<<'v'<<qs[i]<<' ';
}
}
cout<<'v'<<zd[item];
}