给定有向图无环的边信息,求每个顶点的最早开始时间、最迟开始时间。
输入
第一行图的顶点总数
第二行边的总数
第三行开始,每条边的时间长度,格式为源结点 目的结点 长度
输出
第一行:第个顶点的最早开始时间
第二行:每个顶点的最迟开始时间
输入 | 输出 |
9 12 0 1 3 0 2 10 1 3 9 1 4 13 2 4 12 2 5 7 3 6 8 3 7 4 4 7 6 5 7 11 6 8 2 7 8 5 | 0 3 10 12 22 17 20 28 33 \n 0 9 10 23 22 17 31 28 33 |
#include<iostream>
using namespace std;
struct node{
int va,vb,time;
};
class graph{
int v_len;
int **v_matrix;
int *top_list;
bool *final;
int *ve,*vl;
public:
graph(){}
graph(int len,int **m){
v_len = len;
v_matrix = new int *[len];
for(int i = 0 ; i < len ; i++ ){
v_matrix[i] = new int [len];
for(int j = 0 ; j < len ; j++ ){
v_matrix[i][j] = m[i][j];
}
}
ve = new int [v_len];
vl =new int [v_len];
top_list = new int [v_len];
final = new bool [v_len];
for(int i = 0 ; i < v_len ; i++ ){
ve[i]=0,vl[i]=0;
top_list[i] = 0;
final[i] = false;
}
for(int i = 0 ; i < v_len ; i++ ){
set_toplist(i);
}
// cout<<endl;
set_early();
set_later();
show();
}
void set_toplist(int pos){
for(int i = 0 ; i < v_len ; i++ ){
if(final[i]==false) {
int flag = 0;
for (int j = 0; j < v_len; j++) {
if (final[j] == false && v_matrix[j][i] != 0){
flag = 1;
break;
}
}
if (flag == 0) {
final[i] = true;
top_list[pos] = i;
// cout<<i<<" ";
break;
}
}
}
}
void set_early(){
for(int i = 1 ; i < v_len ; i++ ){
for(int j = 0 ; j < v_len ; j++ ){
int dust = v_matrix[top_list[j]][top_list[i]];
if(dust!=0&&ve[top_list[i]]<ve[top_list[j]]+dust){
ve[top_list[i]] = ve[top_list[j]]+dust;
}
}
}
vl[top_list[v_len-1]] = ve[top_list[v_len-1]];
}
void set_later(){
//做法一:直接刷新vl【i】
// for(int i = v_len-2 ; i >= 0 ; i-- ){
// for(int j = 0 ; j < v_len ; j++ ){
// int dust = v_matrix[top_list[i]][top_list[j]];
// if(dust!=0&&(vl[top_list[i]]==0||vl[top_list[i]]>vl[top_list[j]]-dust)){//0的大小会被虚化,当这个作用被触发两次后,会出现bug
// vl[top_list[i]] = vl[top_list[j]]-dust;
// if(i==18){
// cout<<vl[18]<<" "<<dust<<endl;
// }
// }
// }
// }
//做法二:先来一个无穷大的min,刷新min,循环结束后再让vl【i】=min
int Min;
for(int i = v_len-2 ; i >= 0 ; i-- ){
Min=10000;
for(int j = 0 ; j < v_len ; j++ ){
int dust = v_matrix[top_list[i]][top_list[j]];
if(dust!=0 && (vl[top_list[j]]-dust)<Min){
Min = vl[top_list[j]]-dust;
}
}
vl[top_list[i]]=Min;
}
}
void show(){
for(int i = 0 ; i < v_len ; i++ ){
cout<<ve[i]<<" ";
}
cout<<endl;
for(int i = 0 ; i < v_len ; i++ ){
cout<<vl[i]<<" ";
}
}
};
int main(){
int v_num,l_num;
cin>>v_num>>l_num;
node*line = new node [l_num];
int **m = new int *[v_num];
for(int i = 0 ; i < v_num ; i++ ){
m[i] = new int [v_num];
for(int j = 0 ; j < v_num ; j++ ){
m[i][j]=0;
}
}
for(int i = 0 ; i < l_num ; i++ ){
cin>>line[i].va>>line[i].vb>>line[i].time;
m[line[i].va][line[i].vb] = line[i].time;
}
graph g1(v_num,m);
return 0;
}