直接用邻接矩阵存的时候会出错,原因如下:
大家仔细看测试点,第七个测试点即“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();
}