3 Alice Bob Smith John Alice Smith 5 a c c d d e b e a d 0
Yes No
思路:第一种方法,将赢得人放在一组,输的人放在另一组,看看赢得组中没有出现在输的一组中的个数,若为1,则表示可以产生冠军,否则不可以(这种方法可以在杭电ac)
第二种方法,把每个人看做一个结点,统计每个结点的入度,看所有结点中入度为0的个数有多少个,若为1,则表示可以产生冠军,否则不可以(这种方法不能ac,超内存,当练练拓扑排序)
方法一:
package search.topology; import java.util.Scanner; public class P2094 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); if(n==0){ break; } Containter winners=new Containter(n);//将赢得人放在一个容器中,此容器不能重复存放同一人 Containter losers=new Containter(n);//将输的人放在一个容器中 for(int i=0;i<n;i++){ winners.add(sc.next()); losers.add(sc.next()); } int count=0; boolean flag; for(int i=0;i<winners.num;i++){ flag=true; for(int j=0;j<losers.num;j++){ if(winners.contain[i].compareTo(losers.contain[j])==0){//判断输的人的容器中是否有赢的人 flag=false; break; } } if(flag){//若该赢的人没有出现在输的人中,则可以看做冠军 count++; } } if(count==1){//当可以看做冠军的人数为1时,则表示可以产生冠军 System.out.println("Yes"); }else{ System.out.println("No"); } } } } class Containter{ String[] contain; int num=0; public Containter(int n) { this.contain=new String[n]; } public void add(String str){ if(isExist(str)){//判断是否已经存在容器中了 return ; } contain[num++]=str; } public boolean isExist(String str){ for(int i=0;i<num;i++){ if(contain[i].compareTo(str)==0){ return true; } } return false; } }方法二:
package search.topology; import java.util.Scanner; public class P2094_2 { public static int num;//统计人数 public static String[] str;//存放人名 public static int[][] arc;//记录谁赢了谁 public static int[] degree;//存放每个人输的次数,也就是每个结点的入度 public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n; while(sc.hasNext()){ n=sc.nextInt(); if(n==0){ break; } int x,y; num=0; arc=new int[1000][1000]; degree=new int[1000]; str=new String[n*2]; for(int i=0;i<n;i++){//因为不会用字符串做索引,所以将字符串转化int代替 x=isExist(sc.next()); y=isExist(sc.next()); arc[x][y]=1; degree[y]++; } topoSort(); } } private static void topoSort() { int count=0; for(int i=0;i<num;i++){ if(degree[i]==0){ count++; } } if(count==1){ System.out.println("Yes"); }else{ System.out.println("No"); } } private static int isExist(String s) {//若存在这个人了,就返回这个人的序号,若没有,则新添这个人的序号 for(int i=0;i<num;i++){ if(str[i].compareTo(s)==0){ return i; } } str[num++]=s; return num-1; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u011479875/article/details/47301699