图和拓扑排序

冰晶之魂 2010-12-21 08:11:40
题目:使用STL中的map和list建一个有向图,并写图的基本操作函数:①、插入孤立点函数insert(u);②、插入边的函数insert(u,v),默认权为0;③、插入权为w的边的函数insert(u,v,w);④、删除边函数erase(u,v),删除点函数erase(u);⑤、返回点的出度函数degout(u)、入度函数degin(u)。然后再进行拓扑排序。要求:⑴、使用模板类来写;⑵、把函数放在类graph里,要体现类的特点:封装性....
我老师叫我们写这道题,可我一点思路都没有!求各位大虾帮帮忙!给点思路、算法或部分代码。
...全文
77 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰晶之魂 2010-12-21
  • 打赏
  • 举报
回复
没注释!看不太懂!!
ryfdizuo 2010-12-21
  • 打赏
  • 举报
回复
#include<iostream>

using namespace std;

#define maxsize 50

struct node
{
int adjvex;
node * next;
};

struct graph
{
int vexter;
int in;
node *firstedge;
};


typedef struct
{
int *base;
int *top;
int stacksize;
}sqstack;

void initstack(sqstack &S)
{
S.base=(int *)malloc(sizeof(int));
S.top=S.base;
S.stacksize=maxsize+1;
}

void createadlist(graph inDegree[],int n,int e)//创建邻接链表
{
int i,k,j;
node * q;

for(i=1;i<=n;i++)
{
inDegree[i].vexter=i; //结点的序号
inDegree[i].in=0;
inDegree[i].firstedge=NULL;
}

for(k=1;k<=e;k++)
{
cout<<"依次输入每一条边:\n";
cout<<"从";
cin>>i;
cout<<"邻接到";
cin>>j;
cout<<'\n';
inDegree[j].in++;
q=(node *)malloc(sizeof(struct node));
q->adjvex=j;
q->next=inDegree[i].firstedge;
inDegree[i].firstedge=q;
}
}


void TopoSort(graph inDegree[],int n)
{
int i,v,count=0;
sqstack S;
node * p;

initstack(S);
for(i=1;i<=n;i++)
if(inDegree[i].in==0)
*S.top++=i;

while(S.top!=S.base)
{
v=*--S.top;
cout<<v<<"\t";
count++;
p=inDegree[v].firstedge;
while(p!=NULL)
{
inDegree[p->adjvex].in--;
if(inDegree[p->adjvex].in==0)
*S.top++=p->adjvex;
p=p->next;
}
}
cout<<endl;
if(count<n) cout<<"有回路"<<endl;
else cout<<"无回路"<<endl;
}

void TestTopoSort()
{
graph inDegree[maxsize];
int v,e;
cout<<"该AOV网的顶点数:";
cin>>v;
cout<<"该AOV网的边条数:";
cin>>e;
createadlist(inDegree,v,e);
cout<<"拓扑排序序列为:"<<endl;
TopoSort(inDegree,v);
}

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧