zoukankan      html  css  js  c++  java
  • poj 2367 Genealogical tree (拓扑排序)

    火星人的血缘关系很奇怪,一个人可以有很多父亲,当然一个人也可以有很多孩子。
    有些时候分不清辈分会产生一些尴尬。所以写个程序来让n个人排序,长辈排在晚辈前面。

    输入:N 代表n个人 1~n 接下来n行 第i行表示第i个人的孩纸,无序排列,可能为空。0代表一行输入结束。

    (大概我的智商真的不合适,否则怎么这么久了连个拓扑排序都写不好,T了三次。。)

    代码:

    /********************************************
    Problem: 2367		User:
    Memory: 700K		Time: 32MS
    Language: G++		Result: Accepted
    ********************************************/
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    
    using namespace std;
    
    const int N = 105;
    int n;
    vector<int> G[N];
    int RD[N];
    int vis[N];
    
    void topsort()
    {
    	for (int j = 1; j <= n; ++j)
    		for (int i = 1; i <= n; ++i) {
    			if (!vis[i] && RD[i] == 0) {
    
    				if (j != 1) printf(" ");
    				printf("%d", i);
    				for (int k = 0; k < G[i].size(); ++k)
    					--RD[G[i][k]];
    				vis[i] = 1;
    				break;
    			}
    		}
    	printf("
    ");
    }
    
    int main()
    {
    	scanf("%d", &n);
    	for (int i = 1; i <= n; ++i) {
    		int temp;
    		while (scanf("%d", &temp) == 1) {
    			if (temp == 0) break;
    			G[i].push_back(temp);
    			++RD[temp];
    		}
    	}
    	topsort();
        return 0;
    }
    

      

    好吧,改了一下第一次的代码也A了,输入的问题= =#

    /****************************************
    Problem: 2367		User: 
    Memory: 736K		Time: 0MS
    Language: G++		Result: Accepted
    ****************************************/
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    
    using namespace std;
    
    const int N = 105;
    
    int mp[N][N]; // mp[i][j] i is j's son
    int vis[N];
    int n;
    
    void read(int i)
    {
    	char ch;
    	int ans = 0;
    	
    	while (scanf("%d", &ch), ch) {
    		mp[ch][i] = 1;
    		++mp[ch][0];
    	}
    }
    
    void tpsort()
    {
    	int i, j;
    	for (j = 1; j <= n; ++j) {
    		for (i = 1; i <= n; ++i) {
    			if (!vis[i] && mp[i][0] == 0) {
    				if (j != 1) printf(" ");
    				printf("%d", i);
    				vis[i] = 1;
    
    				for (int k = 1; k <= n; ++k) {
    					if (!vis[k] && mp[k][i] == 1) {
    						mp[k][i] = 0;
    						--mp[k][0];
    					}
    				}
    				break;
    			}
    		}
    	}
    	printf("
    ");
    }
    
    int main()
    {
        scanf("%d", &n);
    	getchar();
    	memset(mp, 0, sizeof mp);
    	memset(vis, 0, sizeof vis);
    	for (int i = 1; i <= n; ++i) {
    		read(i);
    	}
    	tpsort();
        return 0;
    }
    

      

  • 相关阅读:
    poj 3159 Candies
    强连通分量——Tarjan算法
    nyoj 次方求模
    nyoj 快速查找素数
    nyoj 光棍节的快乐
    拓扑排序
    快速幂取模
    nyoj 最大素因子
    素数打表
    nyoj 数的长度
  • 原文地址:https://www.cnblogs.com/wenruo/p/4719203.html
Copyright © 2011-2022 走看看