CodeForces - 475B Strongly Connected City(最短路+判断强联通图/思维)

题目链接:点击查看

题目大意:给出n和m然后给出n条横向街道和m条纵向街道,总共包括了n*m个结点,每条街道都是单向通道,问该图是否能够组成强联通图(有向图中任意两点间都存在路径)

题目分析:乍一看没感觉和最短路有关系,其实可以转换为Floyd的思想,Floyd是可以以n*n*n的时间复杂度求出每两个点之间的最短路,我们只需要将赋值改变一下就可以判断每两个点之间的联通性了,因为给出的是一个矩阵,n和m最大只有20,所以至多有400个点,这个数据范围正好可以用Floyd跑一遍,一开始先根据题目要求建好图,直接跑一遍再判断一遍就出结果了,挺简单的一个题,主要是思路得想到


2019年11月17日更新:

原来这是个思维题emmmm

只用判断一下四周的四条边能否顺时针或逆时针组成一个圈就行了,为什么呢?因为通过每一个点肯定能顺着到达周围的四条边,通过周围的四条边就能遍历所有的每一行每一列了

这里我用了一个四维数组maze[x][y][xx][yy]来记录点(x,y)到点(xx,yy)的联通性,直接上代码了:

Floyd:

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

typedef long long LL;

const int inf=0x3f3f3f3f;

const int N=25;

int n,m;

int maze[N][N][N][N];

bool check()//判断联通性,若两个点之间的最短路为0则联通,为inf则为不联通
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			for(int ii=1;ii<=n;ii++)
				for(int jj=1;jj<=m;jj++)
					if(maze[i][j][ii][jj]==inf)
						return false;
	return true;
}

int main()
{
//	freopen("input.txt","r",stdin);
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(int i=1;i<=n;i++)//初始化
			for(int j=1;j<=m;j++)
				for(int ii=1;ii<=n;ii++)
					for(int jj=1;jj<=m;jj++)
						maze[i][j][ii][jj]=(i==ii&&j==jj)?0:inf; 
		string x,y;
		cin>>x>>y;
		x=" "+x;
		y=" "+y;
		for(int i=1;i<=n;i++)//根据题目要求建边
		{
			if(x[i]=='>')
			{
				for(int j=1;j1;j--)
					maze[i][j][i][j-1]=0;
			}
		}
		for(int j=1;j<=m;j++)
		{
			if(y[j]=='v')
			{
				for(int i=1;i1;i--)
					maze[i][j][i-1][j]=0;
			}
		}
		for(int k=1;k<=n;k++)//Floyd
			for(int kk=1;kk<=m;kk++)
				for(int i=1;i<=n;i++)
					for(int j=1;j<=m;j++)
						for(int ii=1;ii<=n;ii++)
							for(int jj=1;jj<=m;jj++)
								if(maze[i][j][k][kk]+maze[k][kk][ii][jj]

思维:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
 
typedef long long LL;
 
const int inf=0x3f3f3f3f;
 
const int N=1e5+100;

char a[N],b[N];

int main()
{
//  freopen("input.txt","r",stdin);
//	ios::sync_with_stdio(false);
	int n,m;
	scanf("%d%d",&n,&m);
	scanf("%s%s",a+1,b+1);
	if(a[1]=='<'&&a[n]=='>'&&b[1]=='v'&&b[m]=='^')
		puts("YES");
 	else if(a[1]=='>'&&a[n]=='<'&&b[1]=='^'&&b[m]=='v')
		puts("YES");
	else
		puts("NO");

	
	
	
     
     
     
     
      
     
    return 0;
}

 

你可能感兴趣的:(最短路,图论,思维)