藍橋杯-網(wǎng)格尋路

問題描述
X 國的一個網(wǎng)絡使用若干條線路連接若干個節(jié)點。節(jié)點間的通信是雙向的。某重要數(shù)據(jù)包,為了安全起見,必須恰好被轉發(fā)兩次到達目的地。該包可能在任意一個節(jié)點產(chǎn)生,我們需要知道該網(wǎng)絡中一共有多少種不同的轉發(fā)路徑。

源地址和目標地址可以相同,但中間節(jié)點必須不同。

如下圖所示的網(wǎng)絡。


網(wǎng)絡
網(wǎng)絡

1 -> 2 -> 3 -> 1 是允許的

1 -> 2 -> 1 -> 2 或者 1 -> 2 -> 3 -> 2 都是非法的。

輸入格式
輸入數(shù)據(jù)的第一行為兩個整數(shù)N M,分別表示節(jié)點個數(shù)和連接線路的條數(shù)(1<=N<=10000; 0<=M<=100000)。

接下去有M行,每行為兩個整數(shù) u 和 v,表示節(jié)點u 和 v 聯(lián)通(1<=u,v<=N , u!=v)。

輸入數(shù)據(jù)保證任意兩點最多只有一條邊連接,并且沒有自己連自己的邊,即不存在重邊和自環(huán)。

輸出格式
輸出一個整數(shù),表示滿足要求的路徑條數(shù)。
樣例輸入1
3 3
1 2
2 3
1 3
樣例輸出1
6
樣例輸入2
4 4
1 2
2 3
3 1
1 4
樣例輸出2
10

import java.util.ArrayList;  
import java.util.List;  
import java.util.Scanner;  
  
public class 網(wǎng)格尋路 {  
  
    public static int sum=0;  
      
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        Scanner scanner=new Scanner(System.in);  
        int i,qiDian,zhongDian;  
        List<WangNode> jiHe;  
          
        int nodeShu=scanner.nextInt();  
        int bianShu=scanner.nextInt();  
        WangNode[] wangNodes=new WangNode[nodeShu];  
          
        for(i=0;i<nodeShu;i++){  
            wangNodes[i]=new WangNode(i+1);  
        }  
          
        for(i=0;i<bianShu;i++){  
            qiDian=scanner.nextInt()-1;  
            zhongDian=scanner.nextInt()-1;  
            wangNodes[qiDian].jieDian.add(wangNodes[zhongDian]);  
            wangNodes[zhongDian].jieDian.add(wangNodes[qiDian]);  
        }  
        for(i=0;i<nodeShu;i++){  
            jiHe=new ArrayList<WangNode>();  
            jiHe.add(wangNodes[i]);  
            search(wangNodes[i],jiHe);  
            jiHe.clear();  
        }  
        System.out.println(sum);  
    }  
      
    public static void search(WangNode qiDian,List<WangNode> jiHe){  
        List<WangNode> jiHeTemp=new ArrayList<WangNode>(jiHe);  
        WangNode lastNode;  
        try {  
            lastNode = jiHe.get(jiHeTemp.size()-2);  
        } catch (Exception e) {  
            lastNode=null;  
        }  
        int i;  
        for(i=0;i<qiDian.jieDian.size();i++){  
            if(!qiDian.jieDian.get(i).equals(lastNode)){  
                jiHeTemp.add(qiDian.jieDian.get(i));  
                if(jiHeTemp.size()==4){  
                    sum+=1;  
                    for(WangNode wangNode:jiHeTemp){  
                        System.out.print(wangNode.value+" ");  
                    }  
                    System.out.println();  
                }else{  
                    search(qiDian.jieDian.get(i),jiHeTemp);  
                }  
                jiHeTemp.remove(jiHeTemp.size()-1);  
            }  
        }  
    }  
}  
  
class WangNode{  
    int value;  
    List<WangNode> jieDian=new ArrayList<WangNode>();  
    public WangNode(int value) {  
        // TODO Auto-generated constructor stub  
        this.value=value;  
    }  
} 

5條測試,其中有一條超時,我知道超時問題所在,但是不知道如何去解決,例如1-2-3-4有了就不必再尋找4-3-2-1,但是不知道怎么去解決

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1、三角形面積 如【圖1】所示。圖中的所有小方格面積都是1。那么,圖中的三角形面積應該是多少呢? 請?zhí)顚懭切蔚拿?..
    Jdqm閱讀 1,741評論 0 4
  • 生活大爆炸版石頭剪刀布 題目描述 石頭剪刀布是常見的猜拳游戲:石頭勝剪刀,剪刀勝布,布勝石頭。如果兩個人出拳一樣,...
    bbqub閱讀 535評論 0 0
  • 現(xiàn)在不減肥,以后徒傷悲,不想讓自己的好身材一去不復返,只想要瘦一點再瘦一點,今天,減肥達人張長青放大招,傾力打造減...
    yokinnn閱讀 1,339評論 0 0
  • 作者跟我們聊了些什么? 最近讀了一本很有意思的書,叫做《清醒思考的藝術》。在這本書里,作者向我們例舉了52種思維錯...
    聞人伊一閱讀 252評論 0 1
  • 咖啡應該已經(jīng)是多數(shù)人最喜歡的飲品之一。困了累了來一杯,10幾分鐘后基本就可以滿血復活;考試之前來一杯,我們的專注力...
    韓瑞在里約閱讀 13,216評論 0 5

友情鏈接更多精彩內(nèi)容