• hdu 4948


    Kingdom

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 743    Accepted Submission(s): 347
    Special Judge


    Problem Description
    Teacher Mai has a kingdom consisting of n cities. He has planned the transportation of the kingdom. Every pair of cities has exactly a one-way road.

    He wants develop this kingdom from one city to one city.

    Teacher Mai now is considering developing the city w. And he hopes that for every city u he has developed, there is a one-way road from u to w, or there are two one-way roads from u to v, and from v to w, where city v has been developed before.

    He gives you the map of the kingdom. Hope you can give a proper order to develop this kingdom.
     
    Input
    There are multiple test cases, terminated by a line "0".

    For each test case, the first line contains an integer n (1<=n<=500).

    The following are n lines, the i-th line contains a string consisting of n characters. If the j-th characters is 1, there is a one-way road from city i to city j.

    Cities are labelled from 1.
     
    Output
    If there is no solution just output "-1". Otherwise output n integers representing the order to develop this kingdom.
     
    Sample Input
    3
    011
    001
    000
    0
     
    Sample Output
    1 2 3

    析:n个城市,每一对城市之间有一条有向边连接,现在开始发展每一个城市,要求下一个要发展的城市到之前已经被发展的城市之间不超过两条边,即要么直接相连,要么中间可间隔一条边。要求输出发展顺序,不满足输出-1
    每对点间都存在一条边,为竞赛图,容易想到拓扑排序,但是要逆着排序,以入度最大的为起点拓扑一下

     

    #include <queue>
    #include <math.h>
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #define ll long long
    using namespace std;
    const int N = 505;
    int t, n, m, ans;
    int in[N], res[N];
    char str[N];
    void solve(){
        ans = n;
        int flag = 1;
        while(flag){
            flag = 0;
            int iMax = -1;
            for(int i = 1; i <= n; i ++){
                if(iMax < in[i]){
                    iMax = in[i];
                    flag = 1;
                }
            }
            for(int i = 1; i <= n; i ++){
                if(iMax == in[i]){
                    res[ans--] = i;
                    in[i] = -2;
                }
            }
        }
    }
    int main(){
        while(scanf("%d", &n) && n){
            fill(in, in+n+1, 0);
            for(int i = 1; i <= n; i ++){
                scanf("%s", str+1);
                for(int j = 1; j <= n; j ++){
                    t = str[j]-'0';
                    if(t){
                        in[j] ++;
                    }
                }
            }
            solve();
            for(int i = 1; i < n; i ++){
                printf("%d ", res[i]);
            }
            printf("%d
    ", res[n]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    C# 解析JSON字符串
    C# 调用SAP RFC
    【Vue】vue动态添加表单项
    2020年余额不足,送你3本Python好书充值
    中国编程第一人,一人抵一城!
    2020年测试工作总结!
    这段代码,我在本地运行没问题啊
    我28岁,财务自由168天,却写下一封遗书...
    困惑大家这么多年的区块链技术,终于被沈阳一小区大门给讲明白了
    年轻人越来越有出息的迹象
  • 原文地址:https://www.cnblogs.com/microcodes/p/12827331.html
Copyright © 2020-2023  润新知