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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章