• PAT A1146 Topological Order (25 分)——拓扑排序,入度


    This is a problem given in the Graduate Entrance Exam in 2018: Which of the following is NOT a topological order obtained from the given directed graph? Now you are supposed to write a program to test each of the options.

    gre.jpg

    Input Specification:

    Each input file contains one test case. For each case, the first line gives two positive integers N (≤ 1,000), the number of vertices in the graph, and M (≤ 10,000), the number of directed edges. Then M lines follow, each gives the start and the end vertices of an edge. The vertices are numbered from 1 to N. After the graph, there is another positive integer K (≤ 100). Then K lines of query follow, each gives a permutation of all the vertices. All the numbers in a line are separated by a space.

    Output Specification:

    Print in a line all the indices of queries which correspond to "NOT a topological order". The indices start from zero. All the numbers are separated by a space, and there must no extra space at the beginning or the end of the line. It is graranteed that there is at least one answer.

    Sample Input:

    6 8
    1 2
    1 3
    5 2
    5 4
    2 3
    2 6
    3 4
    6 4
    5
    1 5 2 3 6 4
    5 1 2 6 3 4
    5 1 2 3 6 4
    5 2 1 6 3 4
    1 2 3 4 5 6
    

    Sample Output:

    3 4
    
     
    #include <stdio.h> 
    #include <algorithm>
    #include <set>
    #include <vector>
    #include <string>
    #include <iostream>
    #include <queue>
    using namespace std;
    const int maxn=1001;
    int a[maxn] ;
    int n,m,k;
    vector<int> v;
    vector<int> adj[maxn];
    int degree[maxn]={0};
    int store[maxn]={0};
    int main(){
        scanf("%d %d",&n,&m);
        for(int i=1;i<=m;i++){    
            int c1,c2;    
            scanf("%d %d",&c1,&c2);    
            degree[c2]++;
            adj[c1].push_back(c2);
        }
        scanf("%d",&k);
        for(int i=0;i<k;i++){
            for(int j=1;j<=n;j++){
                store[j]=degree[j];
            }
            int flag=0;
            for(int j=0;j<n;j++){
                int tmp;
                scanf("%d",&tmp);
                if(flag==1){
                    continue;
                }
                else{            
                    if(store[tmp]==0){
                        for(int q=0;q<adj[tmp].size();q++){
                            store[adj[tmp][q]]--;
                        }
                    }
                    else{
                        flag=1;
                    }
                }
            }
            if(flag==1)v.push_back(i);
        }
        for(int i=0;i<v.size();i++){
            printf("%d%s",v[i],i==v.size()-1?"
    ":" ");
        }
    }

    注意点:一开始没头绪要怎么做,翻了翻算法笔记,看了大佬的思路,发现原来这么方便,只要看进来的这个数入度是否为0。有一个坑就是不要一发现一个数不满足条件了就break,这样后面的输入就读不到了,要记录状态continue

    ---------------- 坚持每天学习一点点
  • 相关阅读:
    python,生产环境安装
    neo4j 图数据库
    RNN系列
    机器学习关于AUC的理解整理
    fensorflow 安装报错 DEPENDENCY ERROR
    dubbo Failed to check the status of the service com.user.service.UserService. No provider available for the service
    使用hbase遇到的问题
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk
    gradle 安装
    jenkins 安装遇到的坑
  • 原文地址:https://www.cnblogs.com/tccbj/p/10408994.html
Copyright © 2020-2023  润新知