资源简介
算法实验:计算DAG图最长路径并输出。
代码片段和文件信息
#include
#include
#include
#include
#include
#include
using namespace std;
/*链表节点定义*/
struct listNode{
int name;/*节点号*/
listNode *next;
listNode(int xlistNode *t){
name=x;
next=t;
}
};
/*头节点定义*/
struct vNode{
int color;/*0:白色;1:灰色;2:黑色*/
int len;
int nextN;//DAG图最长路径的后续结点
int indeg;
listNode *next;
};
const int v=100; /*点数*/
const int e=500; /*边数*/
int topoList[v];/*拓扑序列*/
int topo=0;/*拓扑序列中已有的元素个数*/
class GraphlinkedTable{
public:
vNode vertex[v];/*定义头结点*/
vNode dag[v];
GraphlinkedTable();
~GraphlinkedTable(){};
void buildGraph();
bool searchEdge(int v1int v2);
void insertEdge(vNode *nodeint v1int v2);
void print(vNode *v);
void searchBFS(int v1);
int searchV(int v1);/*寻找未被标记的结点*/
void DFS(int v1);/*第一种遍历方法*/
void InDegeree();/*计算每个点的入度*/
int DP(int v1);
void searchLen();
void printPath(int v1);
};
GraphlinkedTable::GraphlinkedTable()/*构造函数*/
{
for(int i=0;i {
vertex[i].next=NULL;
vertex[i].color=0;/*0表示还未遍历过*/
vertex[i].len=0;
vertex[i].nextN=-1;
vertex[i].indeg=0;
//vertex[i].dp=0;
dag[i].next=NULL;
}
}
void GraphlinkedTable::buildGraph(){}
void GraphlinkedTable::insertEdge(vNode *vint v1int v2){
listNode *node=(listNode*)malloc(sizeof(listNode*));
node->name=v2;
node->next=NULL;/*构造节点*/
listNode *temp=v[v1].next;
if(!temp){/*若无其他节点*/
v[v1].next=node;
return;
}
listNode *tempbefore;
while(temp){/*遍历所有节点*/
tempbefore=temp;
temp=temp->next;
}
tempbefore->next=node;
}
bool GraphlinkedTable::searchEdge(int v1int v2){
listNode *temp=vertex[v1].next;
int edge=0;
while(temp){
if(temp->name==v2){
edge=1;
break;
}
temp=temp->next;
}
if(edge==0)/*边不存在返回true否则返回false*/
return true;
else
return false;
}
void GraphlinkedTable::print(vNode *node){
for(int i=0;i cout<“;
listNode *temp=node[i].next;
while(temp){
cout<name<<“->“;
temp=temp->next;
}
cout<<“null“< }
}
void GraphlinkedTable::searchBFS(int v1){
int dis[v];/*初始化距离*/
for(int i=0;i dis[i]=-1;
}
dis[v1]=0;
int u;/*前驱结点的值*/
int v2;/*当前节点的值*/
bool end1=false;/*是否结束循环*/
while(!end1){
end1=true;
queue q;/*定义一个队列*/
q.push(v1);/*将源结点加入队列中*/
while(!q.empty()){
u=q.front();
q.pop();
listNode *temp=vertex[u].next;
while(temp){
v2=temp->name;
if(dis[v2]==-1){/*该结点未被遍历过*/
q.push(v2);
评论
共有 条评论