7-15 最短路径(这题如果要用邻接矩阵需要做点处理)

直接用邻接矩阵存的时候会出错,原因如下:

大家仔细看测试点,第七个测试点即“5 4 0”,它的权值是0。如果我们就一般地用邻接矩阵去存,其marix[5][4]也会是0,而我们一般会用if(marix[x][i]>0)或者if(marix[x][i])判断x是否与i有连接,可是如果判断到这里“5 4 0”,marix[5][4]=0机器就会默认认为5与4没有联结,故输出会出错。

      我们最好用邻接表存储图,我先做一个用邻接矩阵存储地样例。

为了避开机器无法识别“5 4 0”,我们干脆让矩阵默认值是-1(小于0的数),再用if(marix[x][i]>=0)判断x是否与i有连接就可以了。

#include <bits/stdc++.h>
using namespace std;
int num_vertex,num_edge;
int marix[101][101]=;
int indegree[101]={0};
int topology[101];
int et[101];
bool TopologySort(){
     queue<int> room;
     for(int i=0;i<num_vertex;i++){
         if(!indegree[i])
         room.push(i);
     }
     int count=0;
     while(!room.empty()){
         int x=room.front();
         room.pop();
         topology[count++]=x;
         for(int i=0;i<num_vertex;i++){
             if(marix[x][i]>=0){//注意这里要写>=
                 if(!--indegree[i])
                     room.push(i);
                 et[i]=max(et[i],marix[x][i]+et[x]);
             }
         }
     }
     if(count==num_vertex) return true;
     else return false;
 }
int GetEndTime(){
    int maxx=0;
    for(int i=0;i<num_vertex;i++){
        maxx=max(maxx,et[i]);
    }
    return maxx;
}
void SetMarix(){//这里初始化矩阵全为-1
    for(int i=0;i<num_vertex;i++)
        for(int j=0;j<num_vertex;j++)
            marix[i][j]=-1;
}
int main(){
    cin>>num_vertex>>num_edge;
        SetMarix();//引用函数
    for(int i=1;i<=num_edge;i++){
        int from,to,weight;
        cin>>from>>to>>weight;
        marix[from][to]=weight;
        indegree[to]++;
    }
    if(!TopologySort()) cout<<"Impossible";
    else{
        cout<<GetEndTime();
    }
    cout<<endl;
}

不过还是建议用邻接表存储比较好,

邻接表版本

#include <bits/stdc++.h>
using namespace std;
int num_vertex,num_edge;
int indegree[101];
int topology[101];
int et[101]={0};
struct node {
    int to,weight;
};
vector<struct node> adj[101];
bool TopologySort(){
    int index=0;
    queue<int> room;
    for(int i=0;i<num_vertex;i++)
        if(!indegree[i])
            room.push(i);
    while(!room.empty()){
        int x=room.front();
        room.pop();
        topology[index++]=x;
        for(int i=0;i<adj[x].size();i++){
            if(!--indegree[adj[x][i].to])
                room.push(adj[x][i].to);
            et[adj[x][i].to]=max(et[adj[x][i].to],et[x]+adj[x][i].weight);
        }
    }
    if(index==num_vertex)
        return true;
    else return false;
}
int GetEnd(){
    int maxx=0;
    for(int i=0;i<num_vertex;i++)
        maxx=max(maxx,et[i]);
    return maxx;
}
int main(){
    cin>>num_vertex>>num_edge;
    for(int i=0;i<num_edge;i++){
        int from;
        struct node temp;
        cin>>from>>temp.to>>temp.weight;
        indegree[temp.to]++;
        adj[from].push_back(temp);
    }
    if(!TopologySort()) cout<<"Impossible";
    else cout<<GetEnd();
}

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值