zoukankan      html  css  js  c++  java
  • 图的搜索

    vector当邻接表存图

    C. Online Courses In BSU
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Now you can take online courses in the Berland State University! Polycarp needs to pass k main online courses of his specialty to get a diploma. In total n courses are availiable for the passage.

    The situation is complicated by the dependence of online courses, for each course there is a list of those that must be passed before starting this online course (the list can be empty, it means that there is no limitation).

    Help Polycarp to pass the least number of courses in total to get the specialty (it means to pass all main and necessary courses). Write a program which prints the order of courses.

    Polycarp passes courses consistently, he starts the next course when he finishes the previous one. Each course can't be passed more than once.

    Input

    The first line contains n and k (1 ≤ k ≤ n ≤ 105) — the number of online-courses and the number of main courses of Polycarp's specialty.

    The second line contains k distinct integers from 1 to n — numbers of main online-courses of Polycarp's specialty.

    Then n lines follow, each of them describes the next course: the i-th of them corresponds to the course i. Each line starts from the integer ti (0 ≤ ti ≤ n - 1) — the number of courses on which the i-th depends. Then there follows the sequence of ti distinct integers from 1 to n — numbers of courses in random order, on which the i-th depends. It is guaranteed that no course can depend on itself.

    It is guaranteed that the sum of all values ti doesn't exceed 105.

    Output

    Print -1, if there is no the way to get a specialty.

    Otherwise, in the first line print the integer m — the minimum number of online-courses which it is necessary to pass to get a specialty. In the second line print m distinct integers — numbers of courses which it is necessary to pass in the chronological order of their passage. If there are several answers it is allowed to print any of them.

    Examples
    Input
    6 2
    5 3
    0
    0
    0
    2 2 1
    1 4
    1 5
    Output
    5
    1 2 3 4 5
    Input
    9 3
    3 9 5
    0
    0
    3 9 4 5
    0
    0
    1 8
    1 6
    1 2
    2 1 2
    Output
    6
    1 2 9 4 5 3
    Input
    3 3
    1 2 3
    1 2
    1 3
    1 1
    Output
    -1
    Note

    In the first test firstly you can take courses number 1 and 2, after that you can take the course number 4, then you can take the course number 5, which is the main. After that you have to take only the course number 3, which is the last not passed main course.

    #include<map>
    #include<set>
    #include<list>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000000007
    
    using namespace std;
    
    const int N=100005,maxn=1005,inf=0x3f3f3f;
    
    int a[N],color[N];
    bool cycle=0;
    vector<int>v[N],ans;
    void dfs(int x)
    {
        if(color[x]==0)
        {
            color[x]=1;
            for(int i=0;i<v[x].size();i++)
            {
                int k=v[x][i];
                dfs(k);
            }
            color[x]=2;
            v[0].push_back(x);
        }
        else if(color[x]==1)cycle=1;
    }
    int main()
    {
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=k;i++)cin>>a[i];
        for(int i=1;i<=n;i++)
        {
            int res;
            cin>>res;
            while(res--){
                int t;
                cin>>t;
                v[i].push_back(t);
            }
        }
        for(int i=1;i<=k;i++)
        {
            v[0].clear();
            dfs(a[i]);
            for(int i=0;i<v[0].size();i++)
                ans.push_back(v[0][i]);
        }
        if(!cycle)
        {
            cout<<ans.size()<<endl;
            for(int i=0;i<ans.size();i++)
                cout<<ans[i]<<" ";
            cout<<endl;
        }
        else cout<<-1<<endl;
        return 0;
    }
  • 相关阅读:
    [javaSE] GUI(jar包双击运行)
    [javaSE] GUI(打开文件对话框)
    [javaSE] GUI(菜单)
    [javaSE] GUI(对话框Dialog)
    [javaSE] GUI(练习-列出指定目录内容)
    [javaEE] 控制浏览器缓存资源
    [javaEE] response实现图片下载
    [javaSE] GUI(鼠标事件)
    [javaSE] 网络编程(TCP-并发上传图片)
    [javaSE] IO流(装饰设计模式)
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/6612761.html
Copyright © 2011-2022 走看看