图拓扑编程
㈠ 急急急~~~数据结构,编写函数实现图的拓扑排序
#include<stdio.h>
#include<string.h>
#define M 30
int a[M][M],n;
void topo()
{
int i,j,x;
int in[M],ans[M],an;//统计入度,最后答案,答案尺寸
int q[M],qh,qt;//0入度点的队列
memset(in,0,sizeof(in));
an=0;
//统计入度
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]!=0)//假定a[i][j]=0为无边相连
in[j]++;
}
}
//入度为0的点先入队
qh=0;qt=0;
for(i=0;i<n;i++)
{
if(in[i]==0)
{
q[qt]=i;
qt++;
}
}
//拓扑
for(i=0;i<n;i++)
{
if(qh==qt)//队列为空,说明剩余点都不是入度为0的点
break;
x=q[qh];qh++;//取队头
ans[an]=x;an++;//记录答案
for(j=0;j<n;j++)
{
if(a[x][j]!=0)//该点指向的边都减去一个入度
{
in[j]--;
if(in[j]==0)//入队
{
q[qt]=j;
qt++;
}
}
}
}
if(an<n)//答案没有取所有点,说明没有拓扑序
printf("unsolve\n");
else
{
for(i=0;i<an;i++)
printf("%d ",ans[i]);
printf("\n");
}
}
void main()
{
int i,j;
memset(a,0,sizeof(a));
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
topo();
}
应该大概就这样。。。
请根据实际情况修改main函数,或将全局变量处理一下。。。
㈡ 求网络拓扑图的详细编址!@@如图!!
我不知道你是要分配IP地址还是要干什么,直接在路由器上分不就行了,
QQ:165444871
是打发
㈣ c语言编程 拓扑算法
i=0
A[1...n]为一个新数组
循环
寻找入度为零的点,将该点放到位置A[i]中
i=i+1
将该点出边删除
输出A
㈤ 拓扑关系怎样在编程中表示
要选择数据结构哦,
用树或者图储存,各个点的坐标就可以,参考书上有例子的
㈥ c++ 编程 拓扑结构
网状结构最简单的可以使用二维数组实现。比如:
int g[5][5];可以表示一个有5个节点的图。其中,g[i][j]可以表示节点i和节点j之间的距离(或者从i到j的费用,节点i到j之间断路的概率,等等)
㈦ 编程实现图的拓扑排序算法
typedef struct node
{
int adjvex;
struct node *next;
}edgenode;
typedef struct
{
int vertex;
int id;
edgenode *link;
}vexnode;
vexnode dig[n];
void topsort(vexnode dig[])
{
int i,j,k,m=0,top=-1;
edgenode *p;
for(i=0;i<n;i++)
if(dig[i].id==0)
{
dig[i].id=top;
top=i;
}
while(top!=-1)
{
j=top;
top=dig[top].id;
cout<<dig[j].vertex+1<<"\t";
m++;
p=dig[j].link;
while(p)
{
k=p->adjvex;
dig[k].id--;
if(dig[k].id==0)
{
dig[k].id=top;
top=k;
}
p=p->next;
}
}
if(m<n)
cout<<"The network has a cycle.."<<endl;
}
这个是用栈实现的一个算法,你看下吧