题解 P1807 【最长路_NOI导刊2010提高(07)】

· · 题解

主要思路

主要坑点

注意事项

上代码

#include <iostream>
#include <cstdio>
#include <cmath>
#define INF 0x7fffffff   //手动定义INF
using namespace std;
int n,m,x,y,z,map[1501][1501];    //邻接矩阵真好玩
int main(){
    cin>>n>>m;   //输入点数和边数
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            if(i==j) map[i][j]=0;    //邻接矩阵赋初值
            else map[i][j]=INF;    
    for(int i=0;i<m;i++){
        cin>>x>>y>>z;
        x--,y--;   //编号从1~n,注意处理数组越界问题
        map[x][y]=min(map[x][y],-z);   //当两个点有多条路时取最长的那条
    }
    for(int k=0;k<n;k++)   //Floyd模板
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(map[i][k]!=INF&&map[k][j]!=INF)
                    map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
    if(map[0][n-1]==INF) cout<<-1;   //判断两个点是否连通
    else cout<<-map[0][n-1];  //相当于map[0][n-1]*-1
}

如果对您有帮助的话请点个赞哦~