hdu 4948 Kingdom(推论)

hdu 4948 Kingdom(推论)

传送门

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

题解:
首先这道题必然有解,因为题目的条件
其次存在一个推论,对于每个子图而言,当前图入度最大的点距离每个点的距离不超过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