#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;
}