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;
}