#include<iostream>
#include <queue>
#include <list>
using namespace std;
typedef list< vector<int> > LISTINT;
int main()
{
list<vector<int>> list[10];
int qnum=0;
queue<int> q1,q2;//q1 topo,q2 topo order
int n,a,b,c;
int no[10];
int **node = new int *[10];
int *deep=new int[10];
no[1]=0;
for(int i=0;i<10;i++)
{
node[i]=new int[10];
deep[i]=0;
}
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
node[i][j]=0;
}
}
cout<<"共有十个节点编号0~9,其中1为起始节点,10为终止节点。"<<endl;
cout<<"输入共有多少条路径:"<<endl;
cin>>n;
cout<<"输入路径:"<<endl;
for(int i=0;i<n;i++)
{
cin>>a>>b>>c;
node[a][b]=c;
deep[b]++;
}
for(int i=0;i<10;i++)
{
if(deep[i]==0)
q1.push(i);
}
while(!q1.empty())
{
int cur=q1.front();
q1.pop();
q2.push(cur);
qnum++;
for(int i=0;i<10;i++)
{
if(node[cur][i]!=0)
{
deep[i]--;
if(deep[i]==0)
{
q1.push(i);
}
}
}
}
for(int i=0;i<10;i++)
{
vector<int> v;
v.push_back(i);
list[i].push_back(v);
}
if(qnum!=10)
{
cout<<"没有关键路径"<<endl;
return 0;
}
for(int i=0;i<10;i++)
{
no[i]=0;
}
int max=0;
while(!q2.empty())
{
int cur=q2.front();
q2.pop();
for(int i=0;i<10;i++)
{
if(node[cur][i]!=0)
{
if(no[cur]+node[cur][i]>no[i])
{
no[i]=no[cur]+node[cur][i];
list[i].clear();
for (LISTINT::iterator j = list[cur].begin(); j != list[cur].end(); ++j)
{
vector<int> v=*j;
v.push_back(i);
list[i].push_back(v);
}
}
else if(no[cur]+node[cur][i]==no[i])
{
for (LISTINT::iterator j = list[cur].begin(); j != list[cur].end(); ++j)
{
vector<int> v=*j;
v.push_back(i);
list[i].push_back(v);
}
}
if(no[i]>max)
max=no[i];
}
}
}
for (LISTINT::iterator j = list[9].begin(); j != list[9].end(); ++j)
{
vector<int> vec=*j;
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<" ";
}
cout<<endl;
}
return 0;
}
C++实现关键路径的查找(代码)
最新推荐文章于 2024-06-29 20:15:40 发布