图的关键路径
来源:互联网 发布:淘宝怎么查看五星好评 编辑:程序博客网 时间:2024/04/28 15:42
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
struct LinkNode
{
int pos;//邻接点的下标
int weight;//边权值
LinkNode *next;
};
struct VertextNode
{
int in;//入度
int val;//值域
LinkNode *firstEdge;
};
void InsertLinkNode(LinkNode **l, int pos, int weight)
{
LinkNode *tmp = new LinkNode;
tmp->pos = pos;
tmp->weight = weight;
tmp->next = *l;
(*l) = tmp;
}
int TopologicalSort(VertextNode *AdjList, int num, std::stack<int> &stack2, int *etv)
{
int count = 0;//节点数
std::stack<int> myStack;
for(int i = 0; i < num; ++i)
{
etv[i] = 0;
if(AdjList[i].in == 0)
{
myStack.push(i);
}
}
while(!myStack.empty())
{
++count;
int k = myStack.top();
myStack.pop();
stack2.push(k);
std::cout << k << std::endl;
LinkNode *p = AdjList[k].firstEdge;
while(p)
{
int j = p->pos;
if(etv[k] + p->weight > etv[j])
{
etv[j] = etv[k] + p->weight;
}
if((--AdjList[j].in) == 0)
{
myStack.push(j);
}
p = p->next;
}
}
if(count == num)
{
return 1;
}
return 0;
}
void CriticalPath(VertextNode *AdjList, int num, std::stack<int> &stack2, int *etv)
{
int ltv[10];
for(int i = 0; i < num; ++i)
{
ltv[i] = etv[num - 1];
}
while(!stack2.empty())
{
int k = stack2.top();
stack2.pop();
LinkNode *p = AdjList[k].firstEdge;
while(p)
{
int j = p->pos;
if(ltv[j] - p->weight < ltv[k])
{
ltv[k] = ltv[j] - p->weight;
if(ltv[k] == etv[k])
{
std::cout << "<" << k << "," << j << "> " << ltv[k] << std::endl;
}
}
p = p->next;
}
}
}
int main(int nArgs, char* pArg[])
{
VertextNode AdjList[10];
int num = 10;
for(int i = 0; i < 14; ++i)
{
AdjList[i].firstEdge = NULL;
AdjList[i].val = i;
switch (i)
{
case 0:
{
AdjList[i].in = 0;
InsertLinkNode(&AdjList[i].firstEdge, 1, 3);
InsertLinkNode(&AdjList[i].firstEdge, 2, 4);
break;
}
case 1:
{
AdjList[i].in = 1;
InsertLinkNode(&AdjList[i].firstEdge, 3, 5);
InsertLinkNode(&AdjList[i].firstEdge, 4, 6);
break;
}
case 2:
{
AdjList[i].in = 1;
InsertLinkNode(&AdjList[i].firstEdge, 3, 8);
InsertLinkNode(&AdjList[i].firstEdge, 5, 7);
break;
}
case 3:
{
AdjList[i].in = 2;
InsertLinkNode(&AdjList[i].firstEdge, 4, 3);
break;
}
case 4:
{
AdjList[i].in = 2;
InsertLinkNode(&AdjList[i].firstEdge, 6, 9);
InsertLinkNode(&AdjList[i].firstEdge, 7, 4);
break;
}
case 5:
{
AdjList[i].in = 1;
InsertLinkNode(&AdjList[i].firstEdge, 7, 6);
break;
}
case 6:
{
AdjList[i].in = 1;
InsertLinkNode(&AdjList[i].firstEdge, 9, 2);
break;
}
case 7:
{
AdjList[i].in = 2;
InsertLinkNode(&AdjList[i].firstEdge, 8, 5);
break;
}
case 8:
{
AdjList[i].in = 1;
InsertLinkNode(&AdjList[i].firstEdge, 9, 3);
break;
}
case 9:
{
AdjList[i].in = 2;
break;
}
default:
break;
}
}
std::stack<int> stack2;
int etv[10];
if(TopologicalSort(AdjList, 10, stack2, etv))
{
CriticalPath(AdjList, 10, stack2, etv);
}
system("pause");
return 0;
}
#include <algorithm>
#include <vector>
#include <stack>
struct LinkNode
{
int pos;//邻接点的下标
int weight;//边权值
LinkNode *next;
};
struct VertextNode
{
int in;//入度
int val;//值域
LinkNode *firstEdge;
};
void InsertLinkNode(LinkNode **l, int pos, int weight)
{
LinkNode *tmp = new LinkNode;
tmp->pos = pos;
tmp->weight = weight;
tmp->next = *l;
(*l) = tmp;
}
int TopologicalSort(VertextNode *AdjList, int num, std::stack<int> &stack2, int *etv)
{
int count = 0;//节点数
std::stack<int> myStack;
for(int i = 0; i < num; ++i)
{
etv[i] = 0;
if(AdjList[i].in == 0)
{
myStack.push(i);
}
}
while(!myStack.empty())
{
++count;
int k = myStack.top();
myStack.pop();
stack2.push(k);
std::cout << k << std::endl;
LinkNode *p = AdjList[k].firstEdge;
while(p)
{
int j = p->pos;
if(etv[k] + p->weight > etv[j])
{
etv[j] = etv[k] + p->weight;
}
if((--AdjList[j].in) == 0)
{
myStack.push(j);
}
p = p->next;
}
}
if(count == num)
{
return 1;
}
return 0;
}
void CriticalPath(VertextNode *AdjList, int num, std::stack<int> &stack2, int *etv)
{
int ltv[10];
for(int i = 0; i < num; ++i)
{
ltv[i] = etv[num - 1];
}
while(!stack2.empty())
{
int k = stack2.top();
stack2.pop();
LinkNode *p = AdjList[k].firstEdge;
while(p)
{
int j = p->pos;
if(ltv[j] - p->weight < ltv[k])
{
ltv[k] = ltv[j] - p->weight;
if(ltv[k] == etv[k])
{
std::cout << "<" << k << "," << j << "> " << ltv[k] << std::endl;
}
}
p = p->next;
}
}
}
int main(int nArgs, char* pArg[])
{
VertextNode AdjList[10];
int num = 10;
for(int i = 0; i < 14; ++i)
{
AdjList[i].firstEdge = NULL;
AdjList[i].val = i;
switch (i)
{
case 0:
{
AdjList[i].in = 0;
InsertLinkNode(&AdjList[i].firstEdge, 1, 3);
InsertLinkNode(&AdjList[i].firstEdge, 2, 4);
break;
}
case 1:
{
AdjList[i].in = 1;
InsertLinkNode(&AdjList[i].firstEdge, 3, 5);
InsertLinkNode(&AdjList[i].firstEdge, 4, 6);
break;
}
case 2:
{
AdjList[i].in = 1;
InsertLinkNode(&AdjList[i].firstEdge, 3, 8);
InsertLinkNode(&AdjList[i].firstEdge, 5, 7);
break;
}
case 3:
{
AdjList[i].in = 2;
InsertLinkNode(&AdjList[i].firstEdge, 4, 3);
break;
}
case 4:
{
AdjList[i].in = 2;
InsertLinkNode(&AdjList[i].firstEdge, 6, 9);
InsertLinkNode(&AdjList[i].firstEdge, 7, 4);
break;
}
case 5:
{
AdjList[i].in = 1;
InsertLinkNode(&AdjList[i].firstEdge, 7, 6);
break;
}
case 6:
{
AdjList[i].in = 1;
InsertLinkNode(&AdjList[i].firstEdge, 9, 2);
break;
}
case 7:
{
AdjList[i].in = 2;
InsertLinkNode(&AdjList[i].firstEdge, 8, 5);
break;
}
case 8:
{
AdjList[i].in = 1;
InsertLinkNode(&AdjList[i].firstEdge, 9, 3);
break;
}
case 9:
{
AdjList[i].in = 2;
break;
}
default:
break;
}
}
std::stack<int> stack2;
int etv[10];
if(TopologicalSort(AdjList, 10, stack2, etv))
{
CriticalPath(AdjList, 10, stack2, etv);
}
system("pause");
return 0;
}
- 图的关键路径
- 图的关键路径
- 图的关键路径
- 图的关键路径
- 图的关键路径
- 图的关键路径
- 图的关键路径
- 图的关键路径算法
- AOE图的关键路径
- 求图的关键路径
- 图的关键路径的实现
- 图的C++关键路径代码
- 图的拓扑排序与关键路径
- 带树有向图的关键路径
- 关键路径和前导图的计算
- 有向图的关键路径
- 图的关键路径与拓扑排序
- 算法:图的关键路径-数据结构(24)
- 学习笔记
- androidpn-client重要BUG-锁屏掉线解决方法
- 从csdn上看到的一个人学习java的路径
- glLoadIdentity(),glPushMatrix(),glPopMatrix()和glMatrixMode()的作用
- 利用Mongodb的复制集搭建高可用分片,Replica Sets + Sharding的搭建过程
- 图的关键路径
- Flex4 通过WebService 与 Asp .NET 进行交互
- 人格是最高的山
- 黑马程序员 Java自学总结十六 网络编程
- 图的拓扑排序
- 为view的隐藏添加动画
- 【边界防御是什么】
- Android本地化后缀快查
- 把错误当经验