同色三角形——解題報告
阿新 • • 發佈:2019-02-19
題目描述
平面上有n個點(n≤8000),每兩個點之間都有一條紅色或者是黑色的線段,任意三點均不共線。
現在,已知哪些點之間連的線段是紅色的,剩下的線段都是黑色的,要求計算這些點組成的三角
形中有多少是同色的(頂點編號從1到n)?
輸入描述
第一行是n,m(3≤n≤8000),n表示點的個數,m表示紅色線段的條數。下面m行,每
一行都是兩個整數a和b,表示點a和點b之間的線段是紅色的(a<b)。
輸出描述
只有一行,表示同色三角形的個數。
提示:本題輸出資料可能會超出長整數(longint)的範圍。
解題報告:
簡單題,暴搜即可,這題主要是儲存大整數,用一個list儲存即可。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; public class N08SameColorTriangel { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n=sc.nextInt(); int m=sc.nextInt(); int i,k,j; int[][] a = new int[n+1][n+1]; List<Integer> result=new ArrayList<Integer>(); for(i=1;i<=n;i++){ Arrays.fill(a[i], -1); } for(i=1;i<=m;i++){ j=sc.nextInt(); k=sc.nextInt(); a[j][k]=1; a[k][j]=1; } for(i=1;i<=n;i++){ a[i][i]=0; } for(i=1;i<=n;i++){ for(j=i+1;j<=n;j++){ for(k=j+1;k<=n;k++){ if(Caculate(a,i,j,k)){ if(result.size()>0){ result.set(0, result.get(0)+1); }else{ result.add(0, 1); } if(result.get(0)>=10) { OverFlow(result,0); } } } } } for(i=result.size()-1;i>=0;i--){ System.out.print(result.get(i)); } } private static boolean Caculate(int[][] a,int i,int j,int k) { if(a[i][j]==a[j][k]&&a[j][k]==a[i][k]){ return true; }else{ return false; } } private static void OverFlow(List<Integer> result,int t) { if(t>=result.size()){ return; } if(result.get(t)>=10){ if(t+1>=result.size()){ result.add(t+1, 1); }else{ result.set(t+1, result.get(t+1)+1); } result.set(t, 0); } OverFlow(result,t+1); } }