洛谷p1807 spfa算法和拓扑排序两种算法

第一种拓扑排序:

//有重边
//对入度为零的点
#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

 

你可能感兴趣的:(图)