AOE求关键路径

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];

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值