数据结构:图的实现(输出有向图的邻接矩阵与出度和最大的点)

数据结构:图的实现(输出有向图的邻接矩阵与出度和最大的点)

【问题描述】

需要分别基于邻接矩阵和邻接表来实现图ADT

需要实现图的各个基本操作

小明最近在学习数据结构中图的相关知识,他需要输出有向图的邻接矩阵并找出有向图中出度最大的点。你能帮他解决这个问题么?

【输入形式】

每一组第一行有两个数n、m表示n个顶点,m条有向边。

输入顶点信息,并用空格隔开,顶点信息以大写字母表示

接下来有m行,每行三个数u、v、w代表权值为w的一条由u到v的有向边

注意: 2<=n<=10,n<m<=10,w为正整数,输入保证没有自环

【输出形式】

输出矩阵:每条边发出的顶点对应行,进入的顶点对应列

输出的第一个字符为出度和最大的点所表示的字符,第二个为该点的出度的值,如果出度相同,则依据点的字符大小,输出字符大的点。

【样例输入】

4 3
A B C D
A B 1
B C 1
B D 1

【样例输出】

0 1 0 0
0 0 1 1
0 0 0 0
0 0 0 0
B 2

【实验代码提交及评分】

源代码请提交工程压缩包,压缩包内至少包含以下三个文件:

1)XXX.h:图ADT的定义和声明

2)XXX.h:图ADT的实现

3)XXXXX.cpp:主程序

【代码】

Graph.h

#include<iostream>
using namespace std;

#ifndef _Graph
#define _Graph

	class Graph
	{
	        private:
			void operator = (const Graph&) {}
			Graph(const Graph&) {}
		public:
			Graph() {}//构造函数 
			virtual ~Graph() {}//析构函数 
			virtual int n() =0;//顶点数目 
			virtual int e() =0;//边数目 
			virtual int first(int v) =0;//与顶点v关联的第一条边 
			virtual int next(int v,int w) =0;//与顶点v关联的在顶点w后的下一条边 
			virtual void clear()=0;//销毁一个图 
			virtual bool setEdge(int v1,int v2,int wght) =0;//设边权 
			virtual bool delEdge(int v1,int v2) =0;//删除边 
			virtual bool isEdge(int i,int j) =0;//判断是否有边 
			virtual int weight(int v1,int v2) =0;//v1-v2边的边权 
			virtual int getMark(int v) =0;//返回标记信号 
			virtual void setMark(int v,int val) =0;//标记数组中做标记 
			virtual void DFS(Graph *G,int v) =0;//深搜 
	};

#endif 

Graphm.h

#include<iostream>
using namespace std;
#include"Graph.h"

#ifndef _Graphm
#define _Graphm

	class Graphm:public Graph
	{
		private:
			int numVertex,numEdge;
			int **matrix;
			int *mark;
		public:
			Graphm();
			~Graphm();
			void Init(int n);
			int n();
			int e();
			int first(int v);
			int next(int v,int w);
			void clear(); 
			bool setEdge(int v1,int v2,int wt);
			bool delEdge(int v1,int v2);
			bool isEdge(int i,int j);
			int weight(int v1,int v2);
			int getMark(int v);
			void setMark(int v,int val);
            void memset();//重置mark数组 
			void DFS(Graph *G,int v); 
			void print();//输出邻接矩阵 
			int chudu(int v);
	};

#endif

Graphm.cpp

#include<iostream>
#include"Graphm.h"
#include<iomanip>
#define UNVISITED 0
#define VISITED 1
#define INF 1<<30 
using namespace std;


	Graphm::Graphm()
	{
		
	}
	
	Graphm::~Graphm()
	{
		clear(); 
	}
	
	void Graphm::Init(int n)
	{
		numVertex=n;
		numEdge=0;
		mark=new int[n];
		for(int i=0;i<numVertex;i++)
			mark[i]=UNVISITED;
		matrix=(int**) new int*[numVertex];
		for(int i=0;i<numVertex;i++)
	    	matrix[i]=new int[numVertex];
	        for(int i=0;i<numVertex;i++)
	    	        for(int j=0;j<numVertex;j++)
	    		{
	    			if(i==j) matrix[i][j]=0;
	    			else matrix[i][j]=INF;
			}
	}
	
	int Graphm::n()
	{
		return numVertex;
	}
	
	int Graphm::e()
	{
		return numEdge;
	}
	
	int Graphm::first(int v)
	{
		for(int i=0;i<numVertex;i++)
			if(matrix[v][i]!=INF&&matrix[v][i]!=0) return i;
		return numVertex;
	}
	
	int Graphm::next(int v,int w)
	{
		for(int i=w+1;i<numVertex;i++)
			if(matrix[v][i]!=INF&&matrix[v][i]!=0) return i;
		return numVertex;
	}
	
	void Graphm::clear()
	{
		delete [] mark;
		mark=NULL;//释放后置空 
		for(int i=0;i<numVertex;i++) 
			delete [] matrix[i];
		delete [] matrix;
		matrix=NULL;//释放后置空 
	}
	
	bool Graphm::setEdge(int v1,int v2,int wt)
	{
		if(wt<=0)
		{
			cout<<"Illegal weight value\n";
			return false;
		}
		if(v1==v2||v1<0||v2<0||v1>=numVertex||v2>=numVertex)
		{
			cout<<"Illegal vertex\n";
			return false;
		}
		if(matrix[v1][v2]==INF) numEdge++;
		matrix[v1][v2]=wt;
		return true;
	}
	
	bool Graphm::delEdge(int v1,int v2)
	{
		if(v1<0||v2<0||v1>=numVertex||v2>=numVertex||v1==v2)
		{
			cout<<"Illegal vertex\n";
			return false;
		}
		if(matrix[v1][v2]!=INF) numEdge--;
		matrix[v1][v2]=INF;
		return true;
	}
	
	bool Graphm::isEdge(int i,int j)
	{
		if(i==j||matrix[i][j]==INF) return false;
		return true;
	}
	
	int Graphm::weight(int v1,int v2)
	{
		if(v1<0||v2<0||v1>=numVertex||v2>=numVertex||v1==v2)
		{
			cout<<"Illegal vertex\n";
			return INF;
		}
		return matrix[v1][v2];
	}
	
	int Graphm::getMark(int v)
	{
		return mark[v];
	}
	
	void Graphm::setMark(int v,int val)
	{
		mark[v]=val;
	}
	
	void Graphm::memset()
	{
		for(int i=0;i<numVertex;i++)
			mark[i]=UNVISITED;	
	}
	
	
	void Graphm::DFS(Graph* G,int v)
	{
		cout<<v<<' ';//previsit
		G->setMark(v,VISITED);
		for(int w=G->first(v);w<G->n();w=G->next(v,w))
		{
			if(G->getMark(w)==UNVISITED)
				DFS(G,w);
		}
	}
	
	void Graphm::print()
	{
		if(matrix==NULL) 
		{
			cout<<"Empty graph\n";
			return;
		}
	        for(int i=0;i<numVertex;i++)
		{
			for(int j=0;j<numVertex;j++)
			{
				if(matrix[i][j]==INF) cout<<'0'<<' ';
				else cout<<matrix[i][j]<<' ';
			}	
			cout<<endl;
		}	
	}
	
	int Graphm::chudu(int v)
	{
		int num=0;
		
		for(int j=0;j<numVertex;j++)
		{
			if(matrix[v][j]!=INF&&matrix[v][j]!=0) num++;
		}
	    return num;
	}

main.cpp

#include <iostream>
#include "Graphm.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) 
{
	int vertex,edge;
	Graphm G;
	cin>>vertex>>edge;
	G.Init(vertex);
	string l;
	char ll;
	for(int i=0;i<vertex;i++)
	{
		cin>>ll;
		l=l+ll;
	}
	
	for(int i=1;i<=edge;i++)
	{
		char ss,ee;
		int s,e,w;

		cin>>ss>>ee>>w;
		s=l.find(ss);e=l.find(ee);  
		
		G.setEdge(s,e,w);
	}
	
	G.print();
	int maxchudu=G.chudu(0);int maxdian=0;
	for(int i=1;i<vertex;i++)
	{
		if(G.chudu(i)>maxchudu||(G.chudu(i)==maxchudu&&l[i]>l[maxdian]))
		{
			maxchudu=G.chudu(i);maxdian=i;
		}
	}
	cout<<l[maxdian]<<' '<<maxchudu<<endl;
	return 0;
}
  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值