数据结构中图是一个抽象的概念。
如果实际问题中,已经告诉我们哪些点是联通的,哪些点是不联通的了,我们处理的过程中无法判断,需要寻找最优的解决方案(如地图上的最短路径)或是特定值(迷宫出口),则需要边,然后通过遍历来确定哪些点是联通(可行)的。
而还有一种情况是如果任何两个点都可以实现联通(不需要判断),又或者已经通过函数进行判断了,则不需要“边”。
007例子(邻接矩阵)
#include<bits/stdc++.h>
using namespace std;
struct Point{
int x,y;
};
Point Points[100];
vector<vector<int> > Edge(100);
int N,D;
bool BFS(int id){
bool *vis = new bool[N];
memset(vis,false,sizeof(bool)*N);
queue<int> Q;
Q.push(id);
vis[id] = true;
while (!Q.empty()){
int tid = Q.front();
Point tmp = Points[tid];
Q.pop();
if (tmp.x + D >= 50 || tmp.x - D <= -50 ||
tmp.y + D >= 50 || tmp.y - D <= -50){
return true;
}
for (int i=0; i<Edge[tid].size(); i++){
int j = Edge[tid][i];
if (vis[j] == false){
vis[j] = true;
Q.push(j);
}
}
}
return false;
}
int main(){
scanf("%d%d",&N,&D);
for (int i=0; i<N; i++){
scanf("%d%d",&(Points[i].x),&(Points[i].y));
}
//按照合理性划分
for (int i=0; i<N; i++){
for (int j=0; j<N; j++){
int dx = abs(Points[i].x - Points[j].x);
int dy = abs(Points[i].y - Points[j].y);
if (i != j && dx*dx+dy*dy <= D*D){
Edge[i].push_back(j);
Edge[j].push_back(i);
}
}
}
bool success = false;
for (int i=0 ;i<N; i++){
int dx = abs(Points[i].x);
int dy = abs(Points[i].y);
if (sqrt(dx*dx+dy*dy)<=(7.5 + D*1.0)){
success = BFS(i);
}
if (success){
break;
}
}
printf("%s\n",(success?"Yes":"No"));
return 0;
}