package com.douyin;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
/*
https://blog.csdn.net/weixin_43175029/article/details/92842259
题意:
在一组N个人(0,1,2,,,,N-1),每个人都有不同的钱以及不同的安静值,我们将
编号为x的人称为person x, richer[i]=[x,y],表示x比y富有
person x的安静程度为q,我们会说:quiet[x]=q.
answer[x]=y的前提是,在所有比x富有的人中,y是最安静的。
输入:
richer=[[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], quiet=[3,2,5,4,6,1,7,0]
输出:[5,5,2,5,4,5,6,7]
0 1 2 3 4 5 6 7 ---编号人
3 2 5 4 6 1 7 0 ---安静值
answer[0]=5,其中编号为0的人,比其富有的人有直接有1,间接有2,3,在间接有4,5 ,最安静的为5
*/
public class SearchRicherQuiet {
private ArrayList vertexList;//存储点的链表
private static int[][] edges;//邻接矩阵,用来存储边
private int numOfEdges;//边的个数
//初始化
public SearchRicherQuiet(int n){
vertexList=new ArrayList(n);
edges=new int[n][n];
numOfEdges=0;
}
//返回V1,V2的权值
public int getWeight(int v1,int v2){
return edges[v1][v2];
}
//插入边
public void insertEdge(int v1,int v2,int weight){
edges[v1][v2]=weight;
numOfEdges++;
}
//删除边
public void deleteEdge(int v1,int v2){
edges[v1][v2]=0;
numOfEdges--;
}
private static void getRicherAndQuiet(int person, boolean[] visited,Set<Integer> set,int n) {
//得到该节点临近节点
Set<Integer> newSet=getNeighbour(person,n,visited);
set.addAll(newSet);
for(int tmp:newSet){
getRicherAndQuiet(tmp,visited,set,n);
}
}
private static Set<Integer> getNeighbour(int person,int n,boolean[] visited) {
Set<Integer> set=new HashSet<Integer>();
for(int i=0;i<n;i++){
if(visited[i]==false&&edges[person][i]==1){
set.add(i);
visited[i]=true;
}
}
return set;
}
public static void main(String[] args) {
//richer=[[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]],
//quiet=[3,2,5,4,6,1,7,0]
//输出:[5,5,2,5,4,5,6,7]
int[] quiet={3,2,5,4,6,1,7,0};
int[][] richers={{1,0},{2,1},{3,1},{3,7},{4,3},{5,3},{6,3}};
int n=quiet.length;
SearchRicherQuiet srq=new SearchRicherQuiet(n);
//直接输入
edges[0][1]=1;
edges[1][2]=1;
edges[1][3]=1;
edges[7][3]=1;
edges[3][4]=1;
edges[3][5]=1;
edges[3][6]=1;
int[] results=new int[n];
for(int i=0;i<n;i++){
//System.out.println("i="+i);
int person=i;//编号为0的人
//查找比person富的人,找其中最安静的
boolean[] visited=new boolean[n];
visited[person]=true;
Set<Integer> set=new HashSet<Integer>();
getRicherAndQuiet(person,visited,set,n);
//System.out.println(set);
//获取最安静的人
int result=getRealIndex(set,quiet,person);
results[person]=result;
System.out.println("answer["+person+"]="+result);
}
System.out.println("");
for(int i=0;i<results.length;i++){
System.out.print(" "+results[i]);
}
System.out.println("");
}
private static int getRealIndex(Set<Integer> set, int[] quiet,int person) {
if(set.isEmpty()){
return person;
}
int result=person;
int min=quiet[person];
for(int tmp:set){
int tmpValue=quiet[tmp];
if(tmpValue<min){
result=tmp;
min=tmpValue;
}
}
return result;
}
}
1341

被折叠的 条评论
为什么被折叠?



