图的边

数据结构中图是一个抽象的概念。
如果实际问题中,已经告诉我们哪些点是联通的,哪些点是不联通的了,我们处理的过程中无法判断,需要寻找最优的解决方案(如地图上的最短路径)或是特定值(迷宫出口),则需要边,然后通过遍历来确定哪些点是联通(可行)的。
而还有一种情况是如果任何两个点都可以实现联通(不需要判断),又或者已经通过函数进行判断了,则不需要“边”。

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值