您的位置:首页 > 理论基础 > 数据结构算法

08-图8 How Long Does It Take

2018-03-06 19:37 429 查看




思路:
该题为拓扑排序,利用Topsort函数依次遍历,利用辅助数组earlyTime记录到达的某点的最短时间,每次遍历一个点后,减少该点的入度,若入度为0,则压入队列。#include<iostream>
#include<queue>
#define MaxNum 101
#define INF 9999999
using namespace std;
int Node[MaxNum][MaxNum],N,M;
int getMaxTime(int earlyTime[]) {//找出所有点的最大时间的最大值
int MaxTime=0;
for (int i = 0; i < N; i++) {
if (earlyTime[i] > MaxTime) {
MaxTime = earlyTime[i];
}
}
return MaxTime;
}
void TopSort() {
int indegree[MaxNum] = { 0 }, earlyTime[MaxNum] = { 0 },counter=0,MaxTime=0;//counter为计数器
queue<int> q;
for (int i = 0; i < N; i++) {//计算点j的入度
for (int j = 0; j < N; j++) {
if (Node[i][j] != INF) {
indegree[j]++;
}
}
}
for (int i = 0; i < N; i++) {//将所有入度为0的点加入队列内,即开始的点
if (indegree[i] == 0) {
q.push(i);
}
}
while (!q.empty()) {
int k=q.front();
q.pop();
counter++;//计算所有遍历点的个数
for (int i = 0; i < N; i++) {
if (Node[k][i] != INF) {
if (earlyTime[k] + Node[k][i] > earlyTime[i]) {//如果对于当前的最大时间可以更新的话,进行更新
earlyTime[i] = earlyTime[k] + Node[k][i];
}

if (--indegree[i] == 0) {//如果更新后删除k到i的这条边,意义上是对i的入度减一
q.push(i);//如果入度为0,则压入队列
}
}
}
}
MaxTime = getMaxTime(earlyTime);
if (counter != N) {
cout << "Impossible";
}
else {
cout << MaxTime;
}
}
int main()
{
cin >> N >> M;
for (int i = 0; i < N; i++) {//对活动图进行初始化
for (int j = 0; j < N; j++) {
Node[i][j]= INF;
}
}
for (int k = 0; k < M; k++) {
int i, j,time;//输入数据
cin >> i >> j >> time;
Node[i][j] = time;
}
TopSort();
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PTA 数据结构