zoukankan      html  css  js  c++  java
  • 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

    ---------------- 坚持每天学习一点点
  • 相关阅读:
    使用VMware Workstation安装win7镜像文件时遇见的错误
    每次启动懂maven项目都必须关闭javaw.exe进程
    laravel excel导出调节列宽度,对某列中数据颜色处理
    三个<li>元素放一行
    php中bootstrap框架.popover弹出框,鼠标移动到上面自动显示,离开自动消失
    锚点,自动跳转到某处
    WdatePicker控件Javascript取得当前时间、取得减30分钟时间
    (mysql数据库报错)The user specified as a definer ('root'@'%') does not exist
    c# tcp协议发送数据
    c# 键值对的方式post提交
  • 原文地址:https://www.cnblogs.com/tccbj/p/10408994.html
Copyright © 2011-2022 走看看