#include <iostream>
#include <memory.h>
#include <stack>
#include <queue>
using namespace std;
class GraphList;
//边结点的结构体
struct Edge
{
friend class GraphList;
int VerAdj; //邻接顶点序号,从0开始编号
int cost; //边的权值
Edge*Link; //指向下一边节点的指针
Edge(int aVerAdj,int acost,Edge*aLink=NULL){ VerAdj=aVerAdj;cost=acost;Link=aLink;}
Edge(Edge*aLink=NULL){Link=aLink;}
};
//顶点表中结点的结构体
struct Vertex
{
friend class GraphList;
int VerName;//顶点名称
Edge*Adjacent;//边链表的头指针
Vertex(int name,Edge*adjacent=NULL){VerName=name;Adjacent=adjacent;}
Vertex(Edge*adjacent=NULL){Adjacent=adjacent;}
};
//采用邻接表储存的Graph_List类定义 其中所有边均为正权
class GraphList
{
private:
Vertex*Head; //顶点表头指针
int GraphSize; //图中当前顶点的个数
int MaxGraphSize; //图中最大顶点个数
int e; //图中当前边的个数
public:
GraphList(int MaxGraphSize);
virtual ~GraphList();
int IsEmpty() const{return !GraphSize;} //判断图是否为空
int IsFull()const{return GraphSize==MaxGraphSize;} //判断顶点数是否已满
int NumberOfVertices()const{return GraphSize;}//返回图中顶点的个数
int NumberOfEdges()const{return e;} //返回图中边的个数
int GetWeight(const int v1,const int v2)const;//返回指定边的权值
int GetFirstNeighbor(const int v)const;//返回序号为v的第一个邻接顶点的序号
int GetNextNeighbor(const int v1,const int v2)const;//返回序号为v1的顶点相对于序号为v2的点的下一个邻接顶点的序号
int GetNeighbors(const int v,int A[])const;//得到顶点v的邻接顶点表 返回邻接顶点个数
// bool InsertVertex(const int v);//向图中插入一个顶点
bool InsertEdge(const int v1,const int v2,int weight);//向图中插入一条边
// bool DeleteVertex(const int v);//在图中删除一个顶点
bool DeleteEdge(const int v1,const int v2);//在图中删除一条边
void DepthFirstSearch();//从顶点表的第一个顶点开始进行图的深度优先搜索
void DFS(const int v,int visited[]);//从顶点V开始进行图的深度优先搜索
void NDFS(const int v);//从顶点V开始进行图的深度优先搜索的迭代算法
void BFS(const int v);//从顶点V开始进行图的广度优先搜索
void Output();//输出邻接表
//void TopoOrder();//输出图的拓扑排序
//void CriticalPath();//输出图的关键路径
//void ShortestPath(const int v);//在非权图中求指定顶点到其他所有顶点的最短路径
//void DShortestPath(const int v);//在正权图中求指定定点到其他所有定点的最短路径
//void AllLength();//在正权图中求每对顶点间的最短路径
//void Prim();//构造图的最小支撑树的普里姆算法
//void Krustral();
};
//=============================================================================
//构造函数
GraphList::GraphList(int maxgraphsize):MaxGraphSize(maxgraphsize)
{
int from,to,weight;
//用数组实现顶点表,Head指向数组的第一个元素
Head=new Vertex[MaxGraphSize];
cout<<"请输入顶点数和边数"<<endl;
cin>>GraphSize;
cin>>e;
//初始化:
//顶点名字从0 -> GraphSize-1
for(int i=0;i<GraphSize;i++)
{
Head[i].VerName=i;
Head[i].Adjacent=NULL;
}
//空结点初始化
for(int i=GraphSize;i<MaxGraphSize;i++)
{
Head[i].VerName=-1;
Head[i].Adjacent=NULL;
}
for(int i=0;i<e;i++)
{
cout<<"输入始点,终点和权值:(这是第"<<i+1<<"条边) 空格隔开"<<endl;
cin>>from>>to>>weight;//输入新边的始点终点和权值
Edge*p=new Edge(to,weight,NULL);
Edge*q=Head[from].Adjacent;
if(q==NULL){
Head[from].Adjacent=p; //如果是第一条边
}else {
while(q->Link!=NULL) //如果不是第一条边,插到边结点最后
{
q=q->Link;
}
q->Link=p;
}
}
cout<<"创建成功!"<<endl;
}
//析构函数
GraphList::~GraphList()
{
for(int i=0;i<MaxGraphSize;i++)
{
Edge*p=Head[i].Adjacent;
while(p!=NULL)
{
Edge*q=p->Link;
delete p;
p=q;
}
}
delete []Head;
}
int GraphList::GetWeight(const int v1,const int v2)const //返回v1->v2的边的权
{
//如果其中一个顶点不存在
if(v1==-1||v2==-1) return 0;
Edge*p=Head[v1].Adjacent;
while(p!=NULL)
{
if(p->VerAdj==v2)
return p->cost;
p=p->Link;
}
return 0;
}
int GraphList::GetFirstNeighbor(const int v)const //返回第一个邻接点 若找不到则返回-1
{
if(v==-1||v>=GraphSize) return -1;
Edge*p=Head[v].Adjacent;
if(p!=NULL)
return p->VerAdj;
else return -1;
}
int GraphList::GetNextNeighbor(const int v1,const int v2)const //返回v1除了v2以外的下一个邻接点
{
if(v1==-1||v1>=GraphSize||v2==-1||v2>=GraphSize)
{
//cout<<"找不到"<<endl;
return -1;
}
Edge*p=Head[v1].Adjacent;
while(p!=NULL&&p->VerAdj!=v2)//找到v2
p=p->Link;
if(p==NULL||p->Link==NULL)
{
//cout<<"找不到"<<endl;
return -1;
}
p=p->Link;
return p->VerAdj;
}
int GraphList::GetNeighbors(const int v,int A[])const //得到顶点v的邻接顶点表 返回v的邻接顶点个数
{
if(v==-1||v>=GraphSize) return 0;
memset(A,0,sizeof(A));//初始化
int i=0;
Edge*p=Head[v].Adjacent;
while(p!=NULL)
{
A[i++]=p->VerAdj;
p=p->Link;
}
return i;
}
/*
bool GraphList::InsertVertex(const int v)//插入一个顶点
{
if(v<MaxGraphSize&&v>=0)
{
if(Head[v].VerName==-1)
{
Head[v].VerName=v;
GraphSize++;
return 1;
}
cout<<"顶点已存在";
return 0;
}
cout<<"越界,插入失败"<<endl;
return 0;
}
*/
bool GraphList::InsertEdge(const int v1,const int v2,int weight) //插入指定边
{
if(v1==-1||v2==-1||v1>=GraphSize||v2>=GraphSize) return 0;
Edge*q=new Edge(v2,weight,NULL);
Edge*p=Head[v1].Adjacent;
if(p==NULL){
Head[v1].Adjacent=q;
}else {
while(p->Link!=NULL&&p->VerAdj!=v2)
p=p->Link;
if(p->VerAdj==v2) return 0;//如果已经有这条边则插入失败
p->Link=q;
}
e++;
return 1;
}
bool GraphList::DeleteEdge(const int v1,const int v2)//删除指定边
{
if(v1==-1||v2==-1||v1>=GraphSize||v2>=GraphSize) return 0;
Edge*p=Head[v1].Adjacent;
Edge*q=Head[v1].Adjacent;
if(p!=NULL)
{
if(p->VerAdj==v2) //如果V2是第一个节点
{
Head[v1].Adjacent=p->Link;
delete p;
e--;
return 1;
}
//如果V2不是第一个节点
while(p!=NULL&&p->VerAdj!=v2)
{
q=p;
p=p->Link;
}
if(p==NULL)
{
//cout<<"无该边"<<endl;
return 0;
}
q->Link=p->Link;
delete p;
e--;
return 1;
}
//cout<<"无该边"<<endl;
return 0;
}
/*bool GraphList::DeleteVertex(const int v)
{
if(v<0||v>=MaxGraphSize||Head[v].VerName==-1) return -1;
//删除始点为v的边
Edge*p=Head[v].Adjacent;
while(p!=NULL)
{
Head[v].Adjacent=p->Link;
delete p;
e--;
p=Head[v].Adjacent;
}
//删除终点为v的边
for(int i=0;i<GraphSize;i++)
{
if(i==v) continue;
Edge*p=Head[i].Adjacent;
Edge*q;
while(p!=NULL)
{
q=p->Link;
if(q!=NULL&&q->VerAdj==v)
{
p->Link=q->Link;
delete q;
e--;
}
p=p->Link;
}
}
GraphSize--;
Head[v]=Vertex(-1);
return 1;
}
*/
//==============================================================
void GraphList::DepthFirstSearch()
{
int*visited=new int[GraphSize];
int i=0;
while(i<GraphSize)
{
visited[i++]=0;
}
DFS(0,visited);
delete[]visited;
}
void GraphList::DFS(int v,int visited[])
{
cout<<v<<" ";
visited[v]=1;
Edge*p=Head[v].Adjacent;
while(p!=NULL)
{
if(visited[p->VerAdj]!=1)
{
DFS(p->VerAdj,visited);
}
p=p->Link;
}
}
void GraphList::NDFS(int v)
{
//初始化
if(v==-1||v>=GraphSize) return;
int*visited=new int[GraphSize];
int i=0;
while(i<GraphSize) {visited[i++]=0;}
stack<int>S;
//访问顶点v
cout<<v<<" ";
visited[v]=1;
S.push(v);
int w;
while(!S.empty())
{
int v=S.top();
S.pop();
w=GetFirstNeighbor(v);
while(w!=-1)
{
if(!visited[w])
{
cout<<w<<" ";
visited[w]=1;
S.push(w);
}
w=GetNextNeighbor(v,w);
}
}
}
void GraphList::BFS(const int s)
{
//初始化
if(s==-1||s>=GraphSize) return;
int*visited=new int[GraphSize];
int i=0;
while(i<GraphSize) {visited[i++]=0;}
//访问顶点s
cout<<s<<" ";
visited[s]=1;
queue<int>q;
q.push(s);
while(!q.empty())
{
int v=q.front();
q.pop();
int w=GetFirstNeighbor(v);
while(w!=-1)
{
if(!visited[w])
{
cout<<w<<" ";
visited[w]=1;
q.push(w);
}
w=GetNextNeighbor(v,w);
}
}
delete []visited;
}
/*
void GraphList::TopoOrder()
{
//初始化
int n=GraphSize;
int *count=new int[n];
for(int i=0;i<n;i++) count[i]=0;
for(int i=0;i<n;i++)
{
Edge*p=Head[i].Adjacent;
while(p!=NULL){
count[p->VerAdj]++;
p=p->Link;
}
}
int top=-1;
for(int i=0;i<n;i++)
if(count[i]==0)
{
count[i]=top;top=i; //入栈
}
for(int i=0;i<n;i++)
{
if(top==-1)
{
cout<<"There is a cycle in network!"<<endl;
}
else
{
int j=top;
top=count[top];
cout<<j<<" ";//出栈
Edge*p=Head[j].Adjacent;
while(p!=NULL)
{
int k=p->VerAdj;
if(--count[k]==0)
{
count[k]=top;top=k;
}
p=p->Link;
}
}
}
delete []count;
}
/*
void critical_path()
{
int ve[n];
for(int i=0;i<n;i++)
{
ve[i]=0;
}
for(int i=0;i<n-1;i++)
{
p=Head[i]->adjacent(Head[i]);
while(p!=NULL)
{
k=p->VerAdj;
if(ve[i]+p->cost>ve[k])
ve[k]=ve[i]+p->cost;
p=p->Link;
}
}
for(int i=0;i<n;i++)
{
vl[i]=ve[n];
}
for(i=n-1;i>0;i++)
{
p=Head[i].adjacent;
while(p!=NULL)
{
k=p->VerAdj;
if(vl[k]-p->cost<v[i])
{
vl[i]=vl[k]-p->cost;
}
p=p->Link;
}
}
for(int i=0;i<n;i++)
{
p=Head[i]->adjacent;
while(p!=NULL)
{
k=p->VerAdj;
e=ve[i];
l=vl[k]-p->cost;
}
if(l=e)
printf("<%d,%d> is Critical Activity!");
p=p->Link;
}
}
*/
void GraphList::Output(){
cout<<"当前图如下:"<<endl;
int A[e];
for(int i=0;i<GraphSize;i++)
{
cout<<"H["<<i<<"]->";
Vertex H=Head[i];
int n=GetNeighbors(i,A);
for(int j=0;j<n;j++)
{
cout<<A[j]<<"->";
}
cout<<"\n";
}
}
1 #include <iostream>
2 #include <memory.h>
3 using namespace std;
4
5 const int MaxWeight=1000;
6
7 class Graph_Matrix
8 {
9 private:
10 int MaxGraphSize;
11 int **Edge;
12 int GraphSize;//顶点数
13 int e;//边数
14 int alllengthflag;
15 int**path;
16 int**A;
17 public:
18 Graph_Matrix(int Max);
19 Graph_Matrix(const Graph_Matrix&A);
20 void Create();
21 virtual~Graph_Matrix();
22
23
24 int IsEmpty() const{return !GraphSize;};
25 int GraphFull()const{return GraphSize==MaxGraphSize;}
26 int NumberOfVertices()const{return GraphSize;}
27 int NumberOfEdges()const;//返回图的边的个数
28 int GetWeight(const int &v1,const int&v2);//返回指定边的权值
29 void GetNeighbors(const int &v,int A[]);//返回顶点v的邻接顶点表
30
31 //void InsertVertex(const int &v);//向图中插入一个顶点
32 bool InsertEdge(const int &v1,const int &v2,int weight);//向图中插入一条边
33 bool SetEdge(const int &v1,const int &v2,int weight);
34
35 bool DeleteVertex(const int &v);//在图中删除一个顶点
36 bool DeleteEdge(const int &v1,const int &v2);//在图中删除一条边
37
38 int GetDiameter();
39 //void DepthFirstSearch();//采用递归的方法从顶点表的第一个顶点开始进行图的深度优先搜索
40 //void DFS(const int v);//从顶点V开始进行图的深度优先搜索
41 //void BFS(const int v);//从顶点V开始进行图的广度优先搜索
42
43 bool TopoOrder();//检测是否有环,如果无环输出图的拓扑序列
44
45 //void CriticalPath();//输出图的关键路径
46
47 //void ShortestPath(const int v);//在非权图中求指定顶点到其他所有顶点的最短路径
48 //void DShortestPath(const int v);//在正权图中求指定定点到其他所有定点的最短路径
49
50 void AllLength();//在正权图中求每对顶点间的最短路径
51
52 bool IsFreeTree(); //检测是否为自由树
53
54
55
56 //void Prim();//构造图的最小支撑树的普里姆算法
57 //void Output();//用来测试
58 };
59
60 Graph_Matrix::Graph_Matrix(int Max=100):MaxGraphSize(Max),alllengthflag(0)
61 {
62 cout<<"开始"<<endl;
63 Edge=new int*[Max];
64 for(int i=0;i<Max;i++)
65 Edge[i]=new int[Max];
66 for(int i=0;i<Max;i++)
67 for(int j=0;j<Max;j++)
68 Edge[i][j]=MaxWeight;
69 Create();
70 }
71
72
73 void Graph_Matrix::Create()
74 {
75 int from,to,weight;
76 int E;
77 int i=0;
78 cout<<"请输入顶点和边的个数"<<endl;
79 cin>>GraphSize>>E;
80 while(i<E)
81 {
82 cout<<"请输入第"<<++i<<"条边的始点 终点 权"<<endl;
83 cin>>from>>to>>weight;
84 InsertEdge(from,to,weight);
85 }
86 cout<<"创建成功!"<<endl;
87 }
88
89
90 Graph_Matrix::Graph_Matrix(const Graph_Matrix&A)
91 {
92 e=A.e;
93 GraphSize=A.GraphSize;
94 MaxGraphSize=A.MaxGraphSize;
95 Edge=new int*[MaxGraphSize];
96 for(int i=0;i<MaxGraphSize;i++)
97 Edge[i]=new int[MaxGraphSize];
98 for(int i=0;i<MaxGraphSize;i++)
99 for(int j=0;j<MaxGraphSize;j++)
100 Edge[i][j]=A.Edge[i][j];
101
102 }
103
104
105 bool Graph_Matrix::IsFreeTree()
106 {
107 Graph_Matrix A(*this);//建立自己的副本
108 //计算每个结点的入度
109 int count[A.GraphSize];
110 memset(count,0,sizeof(count));
111 for(int j=0;j<A.GraphSize;j++)//列
112 {
113 for(int i=0;i<A.GraphSize;i++) //行
114 {
115 if(A.Edge[i][j]!=MaxWeight) count[j]++;
116 }
117 cout<<"count["<<j<<"]="<<count[j]<<endl;
118 }
119
120 int temp=0; //计算度为0的点的个数
121
122 int top=-1;//初始化栈顶指针
123 for(int i=0;i<A.GraphSize;i++)
124 {
125 if(count[i]==0)//将入度为0的点入栈
126 {
127 count[i]=top;
128 top=i;
129 temp++;
130 }
131 }
132
133 if(temp!=1) return 0;/*如果有多个度为0的点,则不可能为自由树*/
134
135
136 for(int i=0;i<A.GraphSize;i++)
137 {
138 //cout<<"top="<<top<<endl;
139
140 /*循环群体还未被执行GraphSize次,已经没有入度为0的点,说明有回路*/
141 if(top==-1)
142 {
143 //cout<<"有回路"<<endl;
144 return 0;
145 }
146 else
147 {
148 int j=top;top=count[top];/*从栈中弹出一个顶点 j*/
149 cout<<j<<" ";
150
151 /*删除与j相关的边并更新count*/
152 for(int p=0;p<A.GraphSize;p++)
153 {
154 if(A.Edge[j][p]!=MaxWeight)
155 {
156 A.Edge[j][p]=MaxWeight;
157 count[p]--;
158 A.e--;
159 }
160 }
161 //for(int p=0;p<A.GraphSize;p++)
162 // cout<<"count["<<p<<"]="<<count[p]<<endl;
163
164 for(int p=0;p<A.GraphSize;p++)
165 {
166 if(count[p]==0)/*将入度为0的点入栈*/
167 {
168 count[p]=top;
169 top=p;
170 }
171 }
172
173 }
174 }
175 return 1;
176 }
177
178
179 void Graph_Matrix::AllLength() //在正权图中求每对顶点间的最短路径
180 {
181 alllengthflag=1; //方便析构函数处理,如调用此函数才析构相关数组
182
183 /*初始化*/
184 int n=GraphSize;
185 path=new int*[n]; //path记录最短路径终点前一个结点
186 A=new int*[n]; //A记录最短路径
187 for(int i=0;i<n;i++)
188 {
189 path[i]=new int[n];
190 A[i]=new int[n];
191 }
192 for(int i=0;i<n;i++)
193 {
194 for(int j=0;j<n;j++)
195 {
196 A[i][j]=Edge[i][j];
197 if(i!=j&&A[i][j]<MaxWeight)
198 {
199 path[i][j]=i;
200 }
201 else
202 {
203 path[i][j]=-1;
204 }
205 }
206 }
207
208
209 for(int k=0;k<n;k++)//加入k作为中间结点
210 {
211 for(int i=0;i<n;i++)
212 {
213 if(i!=k)
214 {
215 for(int j=0;j<n;j++)
216 {
217 if(j!=k/*以k作为终点*/&&j!=i/*到自己*/&&A[i][j]!=MaxWeight&&A[i][k]+A[k][j]<A[i][j])
218 {
219 //更新
220 A[i][j]=A[i][k]+A[k][j];
221 path[i][j]=path[k][j];
222 }
223 }
224 }
225 }
226 }
227
228 cout<<"最短路径最后经过的点为:"<<endl;
229 printf(" ");
230 for(int j=0;j<n;j++)
231 printf("% 5d ",j);
232 cout<<endl;
233 for(int i=0;i<n;i++)
234 {
235 printf("% 5d ",i);
236 for(int j=0;j<n;j++)
237 {
238 printf("% 5d ",path[i][j]);
239 }
240 cout<<endl;
241 }
242 cout<<"每对顶点最短路径长度为:"<<endl;
243 printf(" ");
244 for(int j=0;j<n;j++)
245 printf("% 5d ",j);
246 printf("\n");
247 for(int i=0;i<n;i++)
248 {
249 printf("% 5d ",i);
250 for(int j=0;j<n;j++)
251 {
252 printf("% 5d ",A[i][j]);
253 }
254 cout<<endl;
255 }
256 }
257
258
259 int Graph_Matrix::GetDiameter()
260 {
261 if(IsFreeTree()==0)
262 {
263 cout<<"不是有向树"<<endl;
264 return -1;
265 }
266
267 AllLength();
268
269 int d=0;
270 for(int i=0;i<GraphSize;i++)
271 {
272 for(int j=0;j<GraphSize;j++)
273 {
274 if(A[i][j]>d&&A[i][j]!=MaxWeight) d=A[i][j];
275 }
276 }
277 cout<<"直径是"<<d<<endl;
278 return d;
279 }
280
281 int Graph_Matrix::GetWeight(const int &v1,const int&v2){
282 if(v1==-1||v2==-1||v1>=GraphSize||v2>=GraphSize) return 0;
283
284 return Edge[v1][v2];
285 }
286
287 bool Graph_Matrix::DeleteEdge(const int&v1,const int &v2)//删除指定边
288 {
289 if(v1==-1||v2==-1||v1>=GraphSize||v2>=GraphSize) return 0;
290 if(Edge[v1][v2]==MaxWeight) return 0;
291 Edge[v1][v2]==MaxWeight;
292 e--;
293 return 1;
294 }
295
296 bool Graph_Matrix::InsertEdge(const int &v1,const int &v2,int weight)//向图中插入一条边
297 {
298 if(v1==-1||v2==-1||v1>=GraphSize||v2>=GraphSize) return 0;
299 if(v1==v2) return 0;
300 if(Edge[v1][v2]!=MaxWeight) return 0;
301 Edge[v1][v2]=weight;
302 e++;
303 return 1;
304 }
305
306 bool Graph_Matrix::SetEdge(const int &v1,const int &v2,int weight)//修改指定边的权值
307 {
308 if(v1==v2) return 0;
309 if(v1==-1||v2==-1||v1>=GraphSize||v2>=GraphSize) return 0;
310 if( InsertEdge(v1,v1,weight)==0) //插入不成功则该边已存在
311 Edge[v1][v2]=weight;
312 return 1;
313 }
314
315 bool Graph_Matrix::DeleteVertex(const int &v)//删除顶点
316 {
317 if(v==-1||v>=GraphSize) return 0;
318 for(int i=0;i<GraphSize;i++)
319 {
320 if(Edge[i][v]!=MaxGraphSize)
321 {
322 Edge[i][v]=MaxGraphSize;
323 e--;
324 }
325 }
326
327 for(int i=0;i<GraphSize;i++)
328 {
329 if(Edge[v][i]!=MaxGraphSize)
330 {
331 Edge[v][i]=MaxGraphSize;
332 e--;
333 }
334 }
335
336 }
337
338
339
340
341
342 /*
343 void Graph_Matrix::Output()
344 {
345 for(int i=0;i<GraphSize;i++)
346 {
347 for(int j=0;j<GraphSize ;j++)
348 {
349 printf("% 5d ",Edge[i][j]);
350 }
351 cout<<endl;
352 }
353
354 }//测试函数
355 */
356
357 bool Graph_Matrix::TopoOrder()
358 { Graph_Matrix A(*this);//建立自己的副本
359 //计算每个结点的入度
360 int count[A.GraphSize];
361 memset(count,0,sizeof(count));
362 for(int j=0;j<A.GraphSize;j++)//列
363 {
364 for(int i=0;i<A.GraphSize;i++) //行
365 {
366 if(A.Edge[i][j]!=MaxWeight) count[j]++;
367 }
368 //cout<<"count["<<j<<"]="<<count[j]<<endl;
369 }
370
371 int top=-1;//初始化栈顶指针
372 for(int i=0;i<A.GraphSize;i++)
373 {
374 if(count[i]==0)//将入度为0的点入栈
375 {
376 count[i]=top;
377 top=i;
378 }
379 }
380
381 cout<<"拓扑序列为:";
382
383
384 for(int i=0;i<A.GraphSize;i++)
385 {
386 //cout<<"top="<<top<<endl;
387 //循环群体还未被执行GraphSize次,已经没有入度为0的点,说明有回路
388 if(top==-1)
389 {
390 cout<<"有回路"<<endl;
391 return 0;
392 }
393 else
394 {
395 int j=top;top=count[top];//从栈中弹出一个顶点 j
396 cout<<j<<" ";
397 //删除与j相关的边并更新count
398
399 for(int p=0;p<A.GraphSize;p++)
400 {
401 if(A.Edge[j][p]!=MaxWeight)
402 {
403 A.Edge[j][p]=MaxWeight;
404 count[p]--;
405 A.e--;
406 }
407 }
408 //for(int p=0;p<A.GraphSize;p++)
409 // cout<<"count["<<p<<"]="<<count[p]<<endl;
410
411 for(int p=0;p<A.GraphSize;p++)
412 {
413 if(count[p]==0)//将入度为0的点入栈
414 {
415 count[p]=top;
416 top=p;
417 }
418 }
419
420 }
421 }
422 }
423 Graph_Matrix::~Graph_Matrix()
424 {
425 for(int i=0;i<GraphSize;i++)
426 delete[]Edge[i];
427 delete[]Edge;
428
429 if(alllengthflag==1)
430 {
431 for(int i=0;i<GraphSize;i++)
432 delete[]A[i];
433 delete[]A;
434 for(int i=0;i<GraphSize;i++)
435 delete[]path[i];
436 delete[]path;
437 }
438 }
439
440 int main() {
441 Graph_Matrix A(100);
442 //A.Output();
443
444 //A.TopoOrder();
445 A.GetDiameter();
446 return 0;
447 }