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