图的邻接矩阵存储及度计算

来源:互联网 发布:淘宝上为啥不卖电视棒 编辑:程序博客网 时间:2024/05/21 11:32

 DS图—图的邻接矩阵存储及度计算


题目描述

假设图用邻接矩阵存储。输入图的顶点信息和边信息,完成邻接矩阵的设置,并计算各顶点的入度、出度和度,并输出图中的孤立点(度为0的顶点)

--程序要求--

若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio

程序中若include多过一个头文件,不看代码,作0分处理

不允许使用第三方对象或函数实现本题的要求

输入

测试次数T,每组测试数据格式如下:

图类型  顶点数 (D—有向图,U—无向图)

顶点信息

边数

每行一条边(顶点1 顶点2)或弧(弧尾 弧头)信息

输出

每组测试数据输出如下信息(具体输出格式见样例):

图的邻接矩阵

按顶点信息输出各顶点的度(无向图)或各顶点的出度  入度  度(有向图)

图的孤立点。若没有孤立点,不输出任何信息。

样例输入

2
D 5
V1 V2 V3 V4 V5
7
V1 V2
V1 V4
V2 V3
V3 V1
V3 V5
V4 V3
V4 V5
U 5
A B C D E
5
A B
A C
B D
D C
A D

样例输出

0 1 0 1 0
0 0 1 0 0
1 0 0 0 1
0 0 1 0 1
0 0 0 0 0
V1: 2 1 3
V2: 1 1 2
V3: 2 2 4
V4: 2 1 3
V5: 0 2 2
0 1 1 1 0
1 0 0 1 0
1 0 0 1 0
1 1 1 0 0
0 0 0 0 0
A: 3
B: 2
C: 2
D: 3
E

#include<iostream>
#include<string>
using namespace std;
struct Node{
string data;
Node *next;
};
struct Arc {
int adjvex;
Node *firstNode;
Node *nextArc;
};
int findIndex (Arc *arc, int n, string v);
void insert (Node* p,string v);
class Graph{
public:
int vertex;
int edge;
char kind;
Arc* arc;
int **g;
Graph(char k,int n){
int i,j;
kind=k;
vertex=n;
string v1,v2;
int i1,i2;
g=new int*[vertex];
for(i=0;i<vertex;i++)
g[i]=new int[vertex];

for(i=0;i<vertex;i++){
for(j=0;j<vertex;j++)
g[i][j]= 0;
}
arc=new Arc[vertex];
for(i=0;i<vertex;i++){
arc[i].adjvex=i;
arc[i].firstNode=new Node;
cin>>arc[i].firstNode->data;
arc[i].firstNode->next=NULL;
}
cin>>edge;
for(i=0;i<edge;i++){
cin>>v1>>v2;
i1=findIndex(arc,vertex,v1);
i2=findIndex(arc,vertex,v2);
if(kind=='U'){
setEdge(i1,i2);
setEdge(i2,i1);
insert(arc[i1].firstNode,v2);
insert(arc[i2].firstNode,v1);
}
else{
setEdge(i1,i2);
insert(arc[i1].firstNode,v2);
}//else
}//for
}
void setEdge(int i,int j){
g[i][j]=1;
}

void printG(){
int i,j;
for(i=0;i<vertex;i++){
for(j=0;j<vertex-1;j++)
cout<<g[i][j]<<" ";
cout<<g[i][j]<<endl;
}
}
void printVertex(){
int i,j;
if(kind=='U'){
int num=0;
for(i=0;i<vertex;i++){
for(j=0;j<vertex;j++){
if(g[i][j]==1)
num++;
}//for
if(num!=0)
cout<<arc[i].firstNode->data<<": "<<num<<endl;
num=0;
}
}
else{
int innum, outnum;
innum=outnum=0;
for(i=0;i<vertex;i++){
for(j=0;j<vertex;j++){
if(g[i][j]==1)
outnum++;
}//for
for(j=0;j<vertex;j++){
if(g[j][i]==1)
innum++;
}
if(outnum+innum!=0)
cout<<arc[i].firstNode->data<<": "<<outnum<<" "<<innum<<" "<<outnum + innum<<endl;
innum=outnum=0;
}
}
}
void printLone(){
int i,j;
if(kind=='U'){
int num=0;
for(i=0;i<vertex;i++){
for(j=0;j<vertex;j++){
if(g[i][j]==1)
num++;
}//for
if(num==0)
cout<<arc[i].firstNode->data<<endl;
num=0;
}//for
}
else {
int innum,outnum;
innum=outnum=0;
for(i=0;i<vertex;i++){
for(j=0;j<vertex;j++){
if(g[i][j]==1)
outnum++;
}//for
for(j=0;j<vertex;j++){
if(g[j][i]==1)
innum++;
}//for
if(outnum+innum==0)
cout<<arc[i].firstNode->data<<endl;
innum=outnum=0;
}//for
}//else
}
};//Graph
int findIndex(Arc *arc,int n,string v){
int i;
for(i=0;i<n;i++){
if(arc[i].firstNode->data==v)
return i;
}
}
void insert(Node* p,string v){
while(p)
p=p->next;
p=new Node;
p->data=v;
p->next=NULL;
}
int main(){
int t;
cin>>t;
char kind;
int vertexNum;
while(t--){
cin>>kind>>vertexNum;
Graph graph(kind,vertexNum);
graph.printG();
graph.printVertex();
graph.printLone();
}
return 0;
阅读全文
'); })();
1 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机pin码被锁了怎么办 vivo锁了打不开怎么办 解锁密码忘记了怎么办 手机指纹锁坏了怎么办 指纹与密码忘记怎么办 指纹密码锁忘了怎么办 门把手坏了断了怎么办 开门门把手断了怎么办 门把手掉下来了怎么办 门锁舌头断了怎么办 锁舌头出不来了怎么办 门锁舌头坏了怎么办 锁舌头断了怎么办 门锁芯坏了怎么办 门锁的卡槽坏了怎么办 锁舌头坏了怎么办 门锁卡住转不动怎么办 门锁舌头掉出来怎么办 锁从里面打不开怎么办 小锁头打不开了怎么办 防盗门锁不好关怎么办 门锁反锁坏了怎么办 防盗锁弹簧坏了怎么办 门反锁锁芯坏了怎么办 防盗门保险栓坏怎么办 开防盗门拧不动怎么办 门锁钥匙转不动怎么办 防盗门门槛坏了怎么办 防盗门被踹变形怎么办 门锁槽坏了怎么办 门锁木头坏了怎么办 门锁木头烂了怎么办 门锁踹坏了怎么办 电机锁坏了怎么办 不锈钢门锁坏了怎么办 家里锁坏了怎么办 易拉罐拉环断了怎么办 罐头拉环掉了怎么办 红牛红包打不开怎么办 红牛红包点不开怎么办 八宝粥拉环掉了怎么办