实验五图的实现邻接矩阵

1、基于邻接矩阵来实现图 ADT
2、需要实现图的各个基本操作
3、输出有向图的邻接矩阵并找出有向图中出度最大的点

#include<iostream>
using namespace std;
#ifndef GRAPH_H
#define GRAPH_H
	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; 
			virtual int next(int v,int w) =0; 
			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;
			virtual int getMark(int v) =0;
			virtual void setMark(int v,int val) =0; 
			virtual void DFS(Graph *G,int v) =0;
	};

#endif 

#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)return false;
		if(v1==v2||v1<0||v2<0||v1>=numVertex||v2>=numVertex)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)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)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)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;
	}
#include"Graph.h"
#ifndef GRAPHM_H
#define GRAPHM_H
	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();
			void DFS(Graph *G,int v); 
			void print();
			int chudu(int v);
	};
#endif

#include <iostream>
#include "Graphm.h"
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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值