zoukankan      html  css  js  c++  java
  • lightoj 1111

     题目链接 http://www.lightoj.com/volume_showproblem.php?problem=1111

    题意:给你一个有向图再给你几个人的位置,问所有人可以在哪些点相聚。

    简单的搜索题,可以用bfs也可以用dfs,要注意的是存边的时候最好用vector,因为边比较少。

    用struct会超时。下面附上dfs和bfs代码。

    #include <iostream>
    #include <cstring>
    #include <queue>
    #include <vector>
    #include <cstdio>
    using namespace std;
    int a[1100] , map[1100] , vis[1100];
    vector<int> s[1100];
    void bfs(int st) {
        queue<int>q;
        q.push(st);
        vis[st] = 1;
        map[st]++;
        while(!q.empty()) {
            int gg = q.front();
            int len = s[gg].size();
            for(int i = 0 ; i < len ; i++) {
                if(vis[s[gg][i]] != 1) {
                    map[s[gg][i]]++;
                    vis[s[gg][i]] = 1;
                    q.push(s[gg][i]);
                }
            }
            q.pop();
        }
    }
    int main()
    {
        int t;
        scanf("%d" , &t);
        int ans = 0;
        while(t--) {
            ans++;
            int k , n , m;
            for(int i = 0 ; i <= 1100 ; i++) {
                s[i].clear();
            }
            memset(map , 0 , sizeof(map));
            scanf("%d%d%d" , &k , &n , &m);
            for(int i = 0 ; i < k ; i++)
                scanf("%d" , &a[i]);
            for(int i = 0 ; i < m ; i++) {
                int x , y;
                scanf("%d%d" , &x , &y);
                s[x].push_back(y);
            }
            for(int i = 0 ; i < k ; i++) {
                memset(vis , 0 , sizeof(vis));
                bfs(a[i]);
            }
            int cnt = 0;
            for(int i = 1 ; i <= n ; i++) {
                //cout << map[i] << endl;
                if(map[i] == k)
                    cnt++;
            }
            printf("Case %d: %d
    " , ans , cnt);
        }
        return 0;
    }
    
    #include <iostream>
    #include <cstring>
    #include <queue>
    #include <vector>
    #include <cstdio>
    using namespace std;
    int a[1100] , map[1100] , vis[1100];
    vector<int> s[1100];
    void dfs(int st) {
        vis[st] = 1;
        int len = s[st].size();
        for(int i = 0 ; i < len ; i++) {
            if(vis[s[st][i]] == 0) {
                map[s[st][i]]++;
                dfs(s[st][i]);
            }
        }
        return;
    }
    int main()
    {
        int t;
        scanf("%d" , &t);
        int ans = 0;
        while(t--) {
            ans++;
            int k , n , m;
            for(int i = 0 ; i <= 1100 ; i++) {
                s[i].clear();
            }
            memset(map , 0 , sizeof(map));
            scanf("%d%d%d" , &k , &n , &m);
            for(int i = 0 ; i < k ; i++)
                scanf("%d" , &a[i]);
            for(int i = 0 ; i < m ; i++) {
                int x , y;
                scanf("%d%d" , &x , &y);
                s[x].push_back(y);
            }
            for(int i = 0 ; i < k ; i++) {
                memset(vis , 0 , sizeof(vis));
                map[a[i]]++;
                dfs(a[i]);
            }
            int cnt = 0;
            for(int i = 1 ; i <= n ; i++) {
                //cout << map[i] << endl;
                if(map[i] == k)
                    cnt++;
            }
            printf("Case %d: %d
    " , ans , cnt);
        }
        return 0;
    }
    
  • 相关阅读:
    软件测试分类与分级
    项目风险管理(Project Risk Management)
    软件测试基础
    【1】开关电源纹波的抑制
    EMC小知识
    【02】STM32:跑马灯配置
    【01】STM32:GPIO管脚模式设置
    【07】Java入门07:继承与抽象类
    【06】Java入门06:IO流-基础
    【05】Java入门05:Java集合
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6078000.html
Copyright © 2011-2022 走看看