ex2.cpp

来自「上海交通大学本科算法大作业」· C++ 代码 · 共 142 行

CPP
142
字号
#include<iostream>
#include<fstream>
using namespace std;

class Vertices{
public:
		int *w;
		int edgeNum,DFS_Number,father,high,Component;
		void set(int n)
		{
			w=new int[n+1];
			edgeNum=0;
			father=-1;
		}	
		void addEdge(int t)
		{
			edgeNum++;
			w[edgeNum]=t;
		}
};

class Stack{
public:
		void set(int num)
		{	
			s=new int[num];
			n=0;
		}
		int n;//栈内指针
		int *s;
		void insert(int v)
		{
			n++;
			s[n]=v;
		}
		void remove()
		{
			n--;
		}
		int element()
		{
			return s[n];
		}
};	

class Biconnected_Components{
public:
		Vertices *vert;
		Stack stack;
		int subgraph[101][102];
		int DFS_N;
		int num;
		Biconnected_Components()
		{
			int i;
			ifstream inClientFile("data1.txt", ios::in);
			ofstream outClientFile("result1.txt", ios::out);
			int verticeNum;
			if(!inClientFile)
			{
				cout<<"File couldn't be opened!"<<endl;
			}
			inClientFile>>verticeNum;
			vert=new Vertices[verticeNum];
			stack.set(verticeNum);
			for ( i=0; i<verticeNum; i++)
			{
				vert[i].DFS_Number=0;
				vert[i].set(verticeNum);
			}
			while(!inClientFile.eof())
			{
				char t;
				int v,w;
				inClientFile>>t>>v>>t>>w>>t;
				vert[v].addEdge(w);
				vert[w].addEdge(v);
			}
			DFS_N=verticeNum;
			num=0;
			BC(0);	
			outClientFile<<num<<endl;
			for( i=1; i<=num; i++)
			{
				outClientFile<<"(";
				for(int j=1; j<=subgraph[i][0]; j++)
					if(j!=subgraph[i][0])outClientFile<<subgraph[i][j]<<",";
					else outClientFile<<subgraph[i][j]<<")"<<endl;
			}
		}
		
		void BC(int v);

};

void Biconnected_Components::BC(int v)
{
	vert[v].DFS_Number=DFS_N;
	DFS_N--;
	stack.insert(v);
	vert[v].high=vert[v].DFS_Number;
	for(int i=1; i<=vert[v].edgeNum; i++)		
	{
		//不将边加入栈中
		if (vert[v].w[i]!=vert[v].father) 
			if (vert[vert[v].w[i]].DFS_Number==0)
			{
				if(vert[vert[v].w[i]].father==-1) 
					vert[vert[v].w[i]].father=v;
				BC(vert[v].w[i]);
				if (vert[vert[v].w[i]].high<=vert[v].DFS_Number)
				{
					//Stack中到v为止的所有点(包括v)的集合为双连通
					num++;
					int i=0;
					while(stack.element()!=v)
					{
						i++;
						subgraph[num][i]=stack.element();
						stack.remove();
					}
					i++;
					subgraph[num][i]=stack.element();
					subgraph[num][0]=i;
				}
				if(vert[v].high<vert[vert[v].w[i]].high)
					vert[v].high=vert[vert[v].w[i]].high;
			}
			else
				if(vert[v].high<vert[vert[v].w[i]].DFS_Number)
					vert[v].high=vert[vert[v].w[i]].DFS_Number;
	}
}



int main()
{
	Biconnected_Components BC1;
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?