圖拓撲編程
㈠ 急急急~~~數據結構,編寫函數實現圖的拓撲排序
#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;
}
這個是用棧實現的一個演算法,你看下吧