第一种拓扑排序:
//有重边
//对入度为零的点
#include
#include
#include
#include
#include
#define maxn 1505
using namespace std;
struct edge{
int v,w;
};
vector s[maxn];
queue q;
int mx[maxn];
int in[maxn];
int n,m;
int main(){
cin>>n>>m;
int x,y,z;
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
for(int j=0;j z) z=s[x][j].w;
}
s[x].push_back((edge){y,z});
in[y]++;
}
//这道题有点不一样,对于其他没有入度的点需要把对应的边去掉
//仔细想想就知道为什么要去掉
for(int i=1;i<=n;i++){
if(in[i] == 0 && i !=1){
//对于非1的入度为零的点进行top排序
for(int j=0;j
第二种:spfa算法
算法具体看:http://keyblog.cn/article-21.html
#include
#include
#include
#include
#include
#define maxn 1505
using namespace std;
//2、spfa算法:原本是求最短路径
//只需要把权值改为负数,就可以求得最长路径
//考虑重边
#define INF 0x3f3f3f3f
int n,m;
int s[maxn];//最短路径
int t[maxn];//表示是否存在于队列中
queue q;
struct edge{
int v,w;
};
vector v[maxn];
int main(){
int x,y,z;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
z=z*(-1);
// v[x].push_back((edge){y,(-1)*z});
for(int j=0;j