PAT-A 1134 题解

PAT-A 1134 题解

思路分析:

这道题其实还是比较简单的,毕竟没有让我们求最小VC(如果要求这个就。。。巨麻烦好吧,模板都要背死你)。
题目的意思是给定一个集合,让我们看看这个集合中的点是不是出现在所有的边里面。
如果我们以边作为研究对象来建立图,那么做法也比较暴力。每一次查找,遍历所有的边,然后看看这个边里面的结点是不是出现在给定的集合中。由于给定的集合数量大小不确定,可能和n一样大。那么,这样算法的时间复杂度为O(nm)。题目中虽然给定了n,m<10^4,但是处理10 ^8的数据一定会超时(更何况是600ms)的时间限制。所以这个方法不行。
我们再来仔细看看这个方法的缺陷在哪里。由于它每一次的操作都要从所有的边里面去找它的结点所在的位置。假设两次一模一样的查找,那么就进行两次一模一样的操作。这个时候我们想着能不能用空间换时间,来降低时间复杂度。

那不妨换个角度,从点出发来看,看看所有的点产生的边里面是不是包含了整个图的边。由于空间的限制,我们使用邻接矩阵来建图。遍历给定的集合,对每一个点产生的边访问一次,最后把所有的边数量加起来,看看有没有m。所以有要用到我们心心念念的unordered_map了,构造一个hash函数,唯一的映射一条边是否被访问。到这里,基本的问题都解决了。

#include<iostream>
#include<cstdio>
#include<unordered_map>
#include<cstring>
#include<vector>
using namespace std;
const int MAX_N = 10010;
vector<int> matrix[MAX_N];
struct Edge 
{//其实这个是没有必要写的。只是自己一开始的思路产生了问题。。。
    int s,t;//表示连接的两个顶点.
}e[MAX_N];
int n,m,k;
int main(){
 
    scanf("%d%d",&n,&m);
    for(int i = 0;i<m;i++){
        scanf("%d%d",&e[i].s,&e[i].t);//输入边的相关信
        matrix[e[i].s].push_back(e[i].t);
        matrix[e[i].t].push_back(e[i].s);
    }
    scanf("%d",&k);
    while (k--)
    {
        unordered_map<int,bool> visit;
        int len;
        scanf("%d",&len);
        vector<int> v(len);
        for(int i = 0;i<len;i++){
            scanf("%d",&v[i]);
        }
        int cnt = 0;
        for(int i = 0;i<len;i++){
            vector<int> nodes = matrix[v[i]];
            for(int j = 0;j<nodes.size();j++){
                if(!visit[v[i]*10000+nodes[j]]){
                    visit[v[i]*10000+nodes[j]] = visit[nodes[j]*10000+v[i]] = true;
                    cnt++;
                }
            }
        }
        if(cnt == m){
            cout<<"Yes";
        }
        else {
            cout<<"No";
        }
        cout<<endl;
    }
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值