zoukankan      html  css  js  c++  java
  • 1146 Topological Order PAT 甲级

    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
    ----------------------------------------
    题目大意:
    给定n个节点和m条有向边,判断给定的节点序列是否满足拓扑排序
    解:
    记录每个点的入度,对每个输入点判断入度是否为零。
    细节:
    vector<int>tr(in,in+1+n) 数组复制时考虑下标要相同
    对于一组数据,用flag判断结果,注意中途输出和break是否会打乱逻辑,如本题当前组的数据还没有读完
    #include<stdio.h>
    #include<iostream>
    #include<vector>
    #include<stdlib.h>
    #define  maxn  1010
    using namespace std;
    int n, m, k;
    vector<int>edge[maxn];
    int in[maxn];
    int main()
    {
    	cin >> n >> m;
    	for (int i = 0, u, v; i < m; i++) {
    		cin >> u >> v;
    		edge[u].push_back(v);
    		in[v]++;
    	}
    	cin >> k;
    	int res = 0;
    
    	for (int i = 0; i < k; i++) {
    		int flag = 1;
    		int u; vector<int>tr(in, in + n + 1); // tr的下标要和in对应
    		for (int j = 0; j < n; j++) {
    			cin >> u;
    			if (tr[u]) {
    
    				flag = 0;
    					//break;此次不能break;上面还有cin>>u数据还没读完
    			}
    			for (auto z : edge[u])
    				tr[z]--;
    		}
    		if (1 == flag) continue;
    		printf("%s%d", res == 0 ? "" : " ", i);
    		res = 1;
    	}
    	//	system("pause");
    	return 0;
    }
    

      

     
  • 相关阅读:
    HDU 1358 Period (KMP)
    POJ 1042 Gone Fishing
    Csharp,Javascript 获取显示器的大小的几种方式
    css text 自动换行的实现方法 Internet Explorer,Firefox,Opera,Safar
    Dynamic Fonts动态设置字体大小存入Cookie
    CSS Image Rollovers翻转效果Image Sprites图片精灵
    CSS three column layout
    css 自定义字体 Internet Explorer,Firefox,Opera,Safari
    颜色选择器 Color Picker,Internet Explorer,Firefox,Opera,Safar
    CSS TextShadow in Safari, Opera, Firefox and more
  • 原文地址:https://www.cnblogs.com/zxzmnh/p/11645667.html
Copyright © 2011-2022 走看看