hdu 4948 Kingdom(推论)

hdu 4948 Kingdom(推论)

传送门

题意:
题目问从一个城市u到一个新的城市v的必要条件是存在
以下两种路径之一
u --> v
u --> w -->v
询问任意一种能够走完整个地图所有点的访问序列

题解:
首先这道题必然有解,因为题目的条件785934-20170502141053101-1172343322.png
其次存在一个推论,对于每个子图而言,当前图入度最大的点距离每个点的距离不超过2,例如
u-->w-->t-->v
如果v是入度最大的点,必然存在一条u/w-->v的路径,往更长的路径进行推论也一样,因为结合上一个重要的条件(任意两点有一条路径),同样可以得到这个推论

import java.io.*;
import java.util.*;

public class hdu_4948 {
    static class MyInputStream extends InputStream {
        public BufferedInputStream bis = new BufferedInputStream(System.in);

        public int read() throws IOException {
            int i;
            while ((i = bis.read()) < 48)
                if (i == -1)
                    return -1;
            int temp = 0;
            while (i > 47) {
                temp = temp * 10 + i - 48;
                i = bis.read();
            }
            return temp;
        }
    }

    static final int N = 510;
    static int in[] = new int[N];
    static int vis[] = new int[N];
    static int ans[] = new int[N];

    public static void main(String[] args){
        Scanner cin=new Scanner(new InputStreamReader(System.in));
        while (true) {
            int n = cin.nextInt();
            if (n == 0)
                break;
            String st;
            Arrays.fill(in, 0,n+1,0);
            for (int i = 1; i <= n; i++) {
                st=cin.next();
                for (int j = 0; j < n; j++) {
                    if(st.charAt(j)=='1')
                    in[j+1]++;
                }
            }
            Arrays.fill(vis, 0, n + 1, 0);
            int mx, w, cnt = n;
            for (int i = 1; i <= n; i++) {
                mx = 0;
                w = 0;
                for (int j = 1; j <= n; j++) {
                    if (mx <= in[j] && vis[j] == 0) {
                        mx = in[j];
                        w = j;
                    }
                }
                ans[cnt--] = w;
                vis[w] = 1;
            }
            StringBuilder str = new StringBuilder("");
            for (int i = 1; i <= n; i++) {
                if (i > 1)
                    str.append(" ");
                str.append("" + ans[i]);
            }
            System.out.println(str);
        }
        cin.close();
    }
}

转载于:https://www.cnblogs.com/zsyacm666666/p/6795878.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值