aoe网关键路径

3:求关键路径

总时间限制: 

10000ms

 

单个测试点时间限制: 

1000ms

 

内存限制: 

65536kB

描述

求出所给的AOE-网的关键路径。

输入

若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有3个数,分别是该条弧所关联的两个顶点编号和弧的权值

输出

若干个空格隔开的顶点构成的序列(用小写字母)

 

这个题tm坑死我了,没看清题意题意说的是让你输出节点,我给他把边的编号输出了哎呀呀太傻了 我看了一天愣是没找到啥致命错误,这个眼睛呀!!!

#include <bits/stdc++.h>
using namespace std;
vector<int>v[2000],ans,p[2000];
int deg[2000],vl[1000],ve[1000],v1[1000],e[1000];
struct asd{
    int x,y,z;
}ee[1000];
int q[1000][1000];
priority_queue<int,vector<int>,greater<int> >ann;
bool vee[10000];
int n,m;
int main(){

    while(cin>>n>>m){
        memset(deg,0,sizeof(deg));
        for(int i=1;i<=m;i++)
        {
            int a,b,c;
            cin>>a>>b>>c;
            ee[i].x=a,ee[i].y=b,ee[i].z=c;
            q[a][b]=c;
            v[a].push_back(b);
            p[b].push_back(a);
            deg[b]++;
        }

        for(int i=1;i<=n;i++){
            if(deg[i]==0)
            {
                ann.push(i);
            }
        }

        memset(vl,0,sizeof(vl));
        while(ann.size()){
            int t=ann.top();
            ann.pop();
            ans.push_back(t);
            for(int i=0;i<v[t].size();i++)
            {
                int y=v[t][i];
                deg[y]--;
                if(deg[y]==0){
                    ann.push(y);
                }
                vl[y]=max(vl[y],vl[t]+q[t][y]);
            }
        }
        if(ans.size()<n)
            continue;
        memset(ve,0x3f3f3f3f,sizeof(ve));
        ve[ans[n-1]]=vl[ans[n-1]];
        for(int j=n-1;j>=0;j--){
            int xx=ans[j];
            for(int i=0;i<p[xx].size();i++)
            {
                int y=p[xx][i];
                ve[y]=min(ve[y],ve[xx]-q[y][xx]);
            }
        }
        ans.clear();
        memset(vee,false,sizeof(vee));
        for(int i=1;i<=m;i++){
            int x=ee[i].x,y=ee[i].y,z=ee[i].z;
            e[i]=vl[x];
            v1[i]=ve[y]-z;
            //cout<<v1[i]<<' '<<e[i]<<endl;
            if(v1[i]==e[i]){
                if(!vee[x])
                {
                    cout<<'v'<<x<<' ';
                    vee[x]=1;
                }
                if(!vee[y])
                {
                    vee[y]=1;
                    cout<<'v'<<y<<' ';
                }
            }
        }
        cout<<endl;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值