思路:
拓扑排序+关键路径
不知道为什么,和ac过的代码结果一致,但过不去。我怀疑是顺序的问题
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 105
#define INF 1e9
int G[MAXN][MAXN],n;
int path[MAXN];
int ve[MAXN]={0};
int vl[MAXN];
void Initialize(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
G[i][j]=INF;
}
}
}
bool TopSort(){
int s[MAXN],top=-1;
int in[MAXN]={0};
int k=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(G[i][j]!=INF)
in[j]++;
}
}
for(int i=1;i<=n;i++){
if(in[i]==0){
s[++top]=i;
}
}
while(top>=0){
int v=s[top--];
path[k++]=v;
for(int i=1;i<=n;i++){
if(G[v][i]!=INF){
in[i]--;
if(in[i]==0){
s[++top]=i;
}
if(ve[v]+G[v][i]>ve[i]){
ve[i]=ve[v]+G[v][i];
}
}
}
}
if(k==n){
return true;
}
else{
return false;
}
}
int main(){
int m,a,b,c;
cin>>n>>m;
Initialize();
while(m--){
cin>>a>>b>>c;
G[a][b]=c;
}
if(!TopSort())
cout<<"0"<<endl;
else{
// for(int i=0;i<n;i++){
// cout<<path[i]<<" ";
// }
// cout<<endl;
// for(int i=1;i<=n;i++){
// cout<<ve[i]<<" ";
// }
// cout<<endl;
int top=n-1;
cout<<ve[path[top]]<<endl;
for(int i=1;i<=n;i++){
vl[i]=ve[path[top]];
}
while(top>=0){
int v=path[top--];
for(int i=1;i<=n;i++){
if(G[v][i]!=INF&&vl[v]>vl[i]-G[v][i]){
vl[v]=vl[i]-G[v][i];
}
}
}
// for(int i=1;i<=n;i++){
// cout<<vl[i]<<" ";
// }
// cout<<endl;
int k=0,key[MAXN];
for(int i=1;i<=n;i++){
if(ve[i]==vl[i]){
key[k++]=i;
}
}
if(k==1)
cout<<key[0];
else{
for(int i=1;i<k;i++){
cout<<key[i-1]<<"->"<<key[i]<<endl;
}
}
}
return 0;
}