很基础的拓扑排序,初始化预处理,记录好边的价值,队列模拟,最后遍历得出最大价值
#include<iostream>
#include<queue>
using namespace std;
struct node{
int pos;
int indegree;
int value;
int next[30];
int nextvalue[30];
int nextsize;
}p[101];
int n,m;
int sum=0;
int cnt=0;
int MAX(int a,int b){
if(a>b)return a;
else return b;
}
void start(struct node p[101]){
queue<struct node>q;
for(int i=0;i<n;i++){
if(p[i].indegree==0){
q.push(p[i]);
cnt++;
}
}
while(!q.empty()){
struct node t=q.front();
for(int i=0;i<t.nextsize;i++){
p[t.next[i]].value=MAX(p[t.next[i]].value,t.value+t.nextvalue[i]);
p[t.next[i]].indegree--;
if(p[t.next[i]].indegree==0){
q.push(p[t.next[i]]);
cnt++;
}
}
q.pop();
}
if(cnt<n)printf("Impossible");
else{
int max=-1;
for(int i=0;i<n;i++){
max=MAX(max,p[i].value);
}
printf("%d",max);
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
p[i].pos=i;
p[i].indegree=0;
p[i].value=0;
p[i].nextsize=0;
}
for(int i=0;i<m;i++){
int in,out,wage;
scanf("%d %d %d",&in,&out,&wage);
p[in].next[p[in].nextsize]=out;
p[in].nextvalue[p[in].nextsize]=wage;
p[out].indegree++;
p[in].nextsize++;
}
start(p);
}