csp 2017 09-4 通信网络

csp 2017 09-4 通信网络_第1张图片

csp 2017 09-4 通信网络_第2张图片

题目如上,最简单的思路就是dfs或者bfs,从每一点开始遍历图。设置一个标记矩阵,如果从i点出发可以达到点j,则标记matrix[i][j]和matrix[j][i]为1,表示i和j相互之间可知。

该思路正常通过。

代码如下:

#include
#include
#include
#include
#include
using namespace std;

void clear(queue& q) {
    queue empty;
    swap(empty, q);
}

int main()
{
	int n,m;
	cin>>n>>m;
	vector > adj(n+1,vector());
	vector > matrix(n+1,vector(n+1,false));
	int a,b;
	for(int i=0;i>a>>b;
		adj[a].push_back(b);
	}
	vector visted;
	queue q;
	for(int i=1;i<=n;++i)
	{
		clear(q);
		visted=vector (n+1,false);
		q.push(i);
		visted[i]=true;
		while(!q.empty())
		{
			int v=q.front();
			matrix[i][v]=true;
			matrix[v][i]=true;
			q.pop();
			visted[v]=true;
			int size=adj[v].size();
			for(int j=0;j

另一种思路:在实现上一种思路之前,想起了离散数学曾经教过一个Warshall算法,用矩阵的传递闭包来算的。算法原理如下:

csp 2017 09-4 通信网络_第3张图片

参考链接:https://blog.csdn.net/foreverzili/article/details/68481930

我的实现如下:

#include
#include
#include
#include
using namespace std;
void mutiply(vector > &mat1, vector >&mat2)
{
	vector > temp = mat1;
	int n = mat1.size();
	for (int i = 0; i0) temp[i][j] = 1;
			else temp[i][j] = 0;
		}
	}
	mat1 = temp;
}
void add(vector > &mat1, vector >&mat2)
{
	int n = mat1.size();
	for (int i = 0; i > &mat1)
//{
//	int n = mat1.size();
//	for (int i = 0; i> n >> m;
	vector temp(n, 0);
	vector > matrix(n, temp);
	vector >addMatrix = matrix;


	int a, b;
	for (int i = 0; i> a >> b;
		matrix[a - 1][b - 1] = 1;
	}
	vector >curMatrix = matrix;
	add(matrix, addMatrix);
	for (int i = 0; i= n - 1)
			count++;
	}
	cout << count;
	return 0;
}
但是因为是3重循环的原因,所以对大数据量的样例超时了,只能拿35分,果然csp直接暴力算法啥也不想就行。

你可能感兴趣的:(csp,oj)