这是 2018-10-31 的实验任务
描述:给定一个无向图,一共 n 个点,m 条边。请编写一个程序实现两种操作: D x y 从原图中删除连接 x,y 节点的边。 Q x y 询问 x,y 节点是否连通
输入
第一行两个数 n,m(5<=n<=40000,1<=m<=100000)
接下来 m 行,每行一对整数 x y (x,y<=n),表示 x,y 之间有边相连。保证没有重复的边。
接下来一行一个整数 q(q<=100000)
以下 q 行每行一种操作,保证不会有非法删除。
输出
按询问次序输出所有 Q 操作的回答,连通的回答 C,不连通的回答 D
样例输入
3 3
1 2
1 3
2 3
5
Q 1 2
D 1 2
Q 1 2
D 3 2
Q 1 2
样例输出
C C D
解答
// MGraph.h
#ifndef MGraph_H
#define MGraph_H
const int MaxSize_point=40000;
const int MaxSize_arc=100000;
template <class DataType>
class MGraph
{
public:
MGraph(int n,int e);
~MGraph();
void visited_ur();
void DFSTraverse(int v);
void BFSTraverse(int v);
int visited[MaxSize_point];
void Delete(int a,int b);
void Judge();
void Question(int a,int b,int act_count);
private:
DataType vertex[MaxSize_point];
//int arc[MaxSize_point][MaxSize_point];
int **arc;
int vertexNum,arcNum;
char action[MaxSize_arc];
};
#endif
// MGraph.h
#include <iostream>
using namespace std;
#include "MGraph.h"
template<class DataType>
MGraph<DataType>::MGraph(int n,int e)
{
int i,j,k;
vertexNum=n;arcNum=e;
arc=new int *[vertexNum];
for(int i=0;i<vertexNum;i++)
{
arc[i]=new int[vertexNum];
}
/*for( i = 0; i < vertexNum; i++)
{
vertex[i]=a[i];
}*/
for( i = 0; i < vertexNum; i++)
{
for( j = 0; j < vertexNum; j++)
{
arc[i][j]=0;
}
}
for( k = 0; k < arcNum; k++)
{
//cout<<"请输入边的两个顶点的序号(序号从1开始计数):";
cin>>i>>j;
i--;j--;
arc[i][j]=1;arc[j][i]=1;
}
}
template<class DataType>
void MGraph<DataType>::visited_ur()
{
for(int i = 0; i < MaxSize_point; i++)
{
visited[i]=0;
}
}
template<class DataType>
void MGraph<DataType>::DFSTraverse(int v)
{
//cout<<vertex[v];
visited[v]=1;
for(int j=0;j<vertexNum;j++)
if (arc[v][j]==1&&visited[j]==0) {
DFSTraverse(j);
}
}
template<class DataType>
void MGraph<DataType>::BFSTraverse(int v)
{
int Q[MaxSize_point];
int front=-1,rear=-1;
cout<<vertex[v];visited[v]=1;Q[++rear]=v;
while(front!=rear){
v=Q[++front];
for (int j=0;j<vertexNum;j++)
if (arc[v][j]==1&&visited[j]==0) {
cout<<vertex[j];visited[j]=1;Q[++rear]=j;
}
}
}
template<class DataType>
void MGraph<DataType>::Delete(int a,int b)
{
//a--;
//b--;
arc[a][b]=0;
arc[b][a]=0;
}
template<class DataType>
void MGraph<DataType>::Question(int a,int b,int act_count)
{
visited_ur();
DFSTraverse(a);
// cout << " ";
if(visited[b]==0)
action[act_count]='D';
else
action[act_count]='C';
}
template<class DataType>
void MGraph<DataType>::Judge()
{
int q;
char Jud;
int a,b;
int act_count=0;
//cout<<"操作数"<<endl;
cin>>q;
for(int i=0;i<q;i++)
{
//cout<<"指令:"<<endl;
cin>>Jud>>a>>b;
a--;b--;
if(Jud=='Q')
{
Question(a,b,act_count);
act_count++;
}
else
Delete(a,b);
}
for(int i=0;i<act_count;i++)
{
cout<<action[i]<<" ";
}
cout <<endl;
//system("pause");
}
template<class DataType>
MGraph<DataType>::~MGraph()
{
for(int i=0;i<vertexNum;i++)
{
delete [] arc[i];
}
delete arc;
}
// MGraph_main.cpp
#include<iostream>
using namespace std;
#include "MGraph.cpp"
int main(int argc, char const *argv[])
{
int vertexNum,arcNum;
//char ch[]={'A','B','C','D','E'};
//char ch[]={'A','B','C','D'};
//cout << "请输入节点数&bian:"<<endl;
cin >>vertexNum>> arcNum;
MGraph<char> MG(vertexNum,arcNum);
MG.Judge();
//MGraph<char> MG(ch,4,4);
//int i;
/*cout<<"深度优先遍历序列是:";
MG.visited_ur();
for(i=0;i<vertexNum;i++)
{
if(MG.visited[i]==0)
{
MG.DFSTraverse(i);
count++;
}
cout << " ";
}
cout <<endl;
MG.visited_ur();
cout << "广度优先遍历序列是:";
for(i=0;i<vertexNum;i++)
{
if(MG.visited[i]==0)
{
MG.DFSTraverse(i);
}
cout << " ";
}
cout <<endl;
if (count>1)
cout<< "非连通图.连通分量有"<<count<<"个."<<endl;
else
cout<<"连通图."<<endl;*/
system("pause");
return 0;
}
更新记录
/*18-10-24*/
/*将visit加入类中,以避免使用全局变量*/
/*通过循环判定visited实现非连通图遍历*/
/*18-10-31*/
/*基于任务要求进行修改,添加三个成员函数作为功能函数*/