• 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

    ---------------- 坚持每天学习一点点
  • 相关阅读:
    如何面试测试工程师?
    自动登录VSS
    软件质量浅谈
    如何在工作中更好的学习
    用例设计工具PICT — 输入组合覆盖
    如何提高送测版本的质量?
    Findbugs介绍及使用方法
    省市区三级联动(附数据库和导入模板的做法)
    EF-联合查询-结果集-Group by-统计数目
    WCF-复合类型使用;传输图片
  • 原文地址:https://www.cnblogs.com/tccbj/p/10408994.html
Copyright © 2020-2023  润新知