Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
克鲁斯卡尔TLE,好心人帮看看吧克鲁斯卡尔一直TLE。。。。。这个算法也能优化吗? import java.util.*; public class Main { static int[][] adj; static int min=99999999; static int total; static boolean[] bl; public static void main(String[] args) { int mini=0,minj=0,count; int ans; Scanner cin=new Scanner(System.in); int st=cin.nextInt(); while(st--!=0) { total=cin.nextInt(); count=total-2; ans=0; adj=new int[total][total]; bl=new boolean[total]; min=99999999; for(int i=0;i<total;i++) for(int j=0;j<total;j++) { adj[i][j]=cin.nextInt(); if(adj[i][j]<min&&adj[i][j]!=0) { min=adj[i][j]; mini=i; minj=j; } } adj[mini][minj]=99999999; min=99999999; while(count--!=0) { for(int i=0;i<total;i++) for(int j=i;j<total;j++) if(adj[i][j]<min&&adj[i][j]!=0) { min=adj[i][j]; mini=i; minj=j; } //当前最小边 ans=min; min=99999999; adj[mini][minj]=99999999; boolean flag=true; for(int l=0;l<total;l++) bl[l]=false; for(int l=0;l<total;l++) if((adj[mini][l]==99999999||adj[l][mini]==99999999)) if(!dfs(l,mini)) { flag=false; break; } if(flag) { } else { adj[mini][minj]=0; count++; } } System.out.println(ans); cin.nextLine(); } } public static boolean dfs(int m,int n) //判断是否有环路 { bl[m]=true; for(int l=0;l<total;l++) { if(!bl[l]&&(l!=n)&&(adj[m][l]==99999999||adj[l][m]==99999999)) { if(adj[l][n]==99999999||adj[n][l]==99999999) { return false; } if(!dfs(l,n)) return false; } } bl[m]=false; return true; } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator