//算法6.1 采用邻接矩阵表示法创建无向网
#include <iostream>
using namespace std;
#define MaxInt 32767 //表示极大值,即∞
#define MVNum 100 //最大顶点数
#define OK 1
typedef char VerTexType; //假设顶点的数据类型为字符型
typedef int ArcType; //假设边的权值类型为整型
//- - - - -图的邻接矩阵存储表示- - - - -
typedef struct{
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum; //图的当前点数和边数
}AMGraph;
int LocateVex(AMGraph G , VerTexType v){
//确定点v在G中的位置
for(int i = 0; i < G.vexnum; ++i)
if(G.vexs[i] == v)
return i;
return -1;
}//LocateVex
int CreateUDN(AMGraph &G){
//采用邻接矩阵表示法,创建无向网G
int i , j , k;
cout <<"请输入总顶点数,总边数,以空格隔开:";
cin >> G.vexnum >> G.arcnum; //输入总顶点数,总边数
cout << endl;
cout << "输入各点的名称,如a b:" ;
for(i = 0; i < G.vexnum; ++i){
//////////////cout << "请输入第" << (i+1) << "个点的名称:";
cin >> G.vexs[i]; //依次输入点的信息
}
cout << endl;
for(i = 0; i < G.vexnum; ++i) //初始化邻接矩阵,边的权值均置为极大值MaxInt
for(j = 0; j < G.vexnum; ++j)
G.arcs[i][j] = MaxInt;
cout << "输入有向边 如从a到b,输入a b" << endl;
for(k = 0; k < G.arcnum;++k){ //构造邻接矩阵
VerTexType v1 , v2;
ArcType w;
//cout << "请输入第" << (k + 1) << "条边依附的顶点及权值:";
cin >> v1 >> v2;// >> w //输入一条边依附的顶点及权值
i = LocateVex(G, v1); j = LocateVex(G, v2); //确定v1和v2在G中的位置,即顶点数组的下标
G.arcs[i][j] = 1; //边<v1, v2>的权值置为w
////////////////////////////G.arcs[j][i] = G.arcs[i][j]; //置<v1, v2>的对称边<v2, v1>的权值为w
}//for
return OK;
}//CreateUDN
void menu() //显示菜单
{
cout<<"----------------------\n";
cout<<"A.求入度\n";
cout<<"B.求出度\n";
cout<<"0.退出\n"; //以上为功能介绍
cout<<"----------------------\n";
fflush(stdin);
}
int InUDN(AMGraph G,int Q) {
int j,num=0;
//for(Q;; ){
for(j = 0; j < G.vexnum; ++j){
if(G.arcs[j][Q] != MaxInt)num++;
}
//}
return num;
}
int OutUDN(AMGraph G,int Q) {
int j,num=0;
for(j = 0; j < G.vexnum; ++j){
if(G.arcs[Q][j] != MaxInt)num++;
}
return num;
}
int main(){
cout << "************算法6.1 采用邻接矩阵表示法创建有向网**************" << endl << endl;
AMGraph G;
int i , j;
CreateUDN(G);
char a;
int b;
cout <<endl;
cout << "*****邻接矩阵表示法创建的有向网*****" << endl;
for(i = 0 ; i < G.vexnum ; ++i){
for(j = 0; j < G.vexnum; ++j){
if(j != G.vexnum - 1){
if(G.arcs[i][j] != MaxInt)
cout << G.arcs[i][j] << "\t";
else
cout << "∞" << "\t";
}
else{
if(G.arcs[i][j] != MaxInt)
cout << G.arcs[i][j] <<endl;
else
cout << "∞" <<endl;
}
}
}
cout <<endl;
menu();
while(1)
{
cout<<"\n请输入功能选项:";
cin>>a;
while(a!='A'&&a!='a'&&a!='b'&&a!='B'&&a!='0')
cout<<"暂时没有此功能,请重新输入:";
fflush(stdin);
cin>>a;
}
switch(a)
{
case 'A':
while(1){
cout<<"第几个点:"; cin>>b;
while(b<1&&b>G.vexnum )
{
cout<<"没有此点,请重新输入:";
fflush(stdin);
cin>>b;
}
switch(b)
{
default:
cout<<"入度为:"<<InUDN(G,b-1)<<endl<<endl;
break;
}
}
break;
case 'B':
while(1){
cout<<"第几个点:"; cin>>b;
while(b<1&&b>G.vexnum )
{
cout<<"没有此点,请重新输入:";
fflush(stdin);
cin>>b;
}
switch(b)
{
default:
cout<<"出度为:"<<OutUDN(G,b)<<endl<<endl;
break;
}
/////
}
break;
default:
return 0;
}
}
return 0;
}//main
2022-05-26 有向图
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 今天继续图论。 1 定义 有向图对一般图做了一点改进,边有了方向含义,也就是一般图组成边的是无序对偶集(Ni,Nj...
- 模板题 . UVA--- 11183传送 还有这道 POJ 3164 点这传送 举个例子:某个图的部分图中, 1...