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