【链接】
【题意】让你找到所有和x颜色的点中,和该颜色的点颜色不同的相邻的点的个数(重复颜色算一次) 求出哪种颜色的所要求的点的数量最多.
【题解】
对于每一条边只会被查到两次。 所以按照题意暴力枚举的时间复杂度就是O(n+m)级别的 至于查重 只要对找过的点打个标记就很好处理的
【代码】
import java.io.*;import java.util.*;public class Main { static InputReader in; static PrintWriter out; public static void main(String[] args) throws IOException{ //InputStream ins = new FileInputStream("E:\\rush.txt"); InputStream ins = System.in; in = new InputReader(ins); out = new PrintWriter(System.out); //code start from here new Task().solve(in, out); out.close(); } static int N = (int)1e5; static class Task{ int n,m; int c[] = new int[N+10]; ArrayListg[] = new ArrayList[N+10]; ArrayList col[] = new ArrayList[N+10]; int mark[] = new int[N+10]; public void solve(InputReader in,PrintWriter out) { for (int i = 1;i <= N;i++) g[i] = new ArrayList (); for (int i = 1;i <= N;i++) col[i] = new ArrayList (); n = in.nextInt();m = in.nextInt(); for (int i = 1;i <= n;i++) { c[i] = in.nextInt(); col[c[i]].add(i); } for (int i = 1;i <= m;i++) { int x,y; x = in.nextInt();y = in.nextInt(); g[x].add(y);g[y].add(x); } int ans = -1,idx = 0; for (int i = 1;i <= N;i++) if (!col[i].isEmpty()) { int cnt = 0; for (int J = 0;J < (int)col[i].size();J++) { int x = col[i].get(J); int len = g[x].size(); for (int j = 0;j < len;j++) { int y = g[x].get(j); if (c[y]!=c[x]) { if (mark[c[y]]!=i) { cnt++; mark[c[y]] = i; } } } } if (cnt>ans) { ans = cnt; idx = i; } } out.println(idx); } } static class InputReader{ public BufferedReader br; public StringTokenizer tokenizer; public InputReader(InputStream ins) { br = new BufferedReader(new InputStreamReader(ins)); tokenizer = null; } public String next(){ while (tokenizer==null || !tokenizer.hasMoreTokens()) { try { tokenizer = new StringTokenizer(br.readLine()); }catch(IOException e) { throw new RuntimeException(e); } } return tokenizer.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } }}