簡體   English   中英

圖的邊緣

[英]Edges of a graph

考慮我們有一個具有n個頂點(1 <= n <= 5000)的圖,這些頂點被命名為0,1,2,...,n-1;每個頂點都標有數字ai(表示頂點i為標記為ai),我們知道1 <= ai <= 100000(1 <= i <= n)。

當且僅當| au-av | = 1時,頂點u和v連接。 編寫程序來測量該圖形的邊數。

輸入:在第一行給出n,在接下來的n行給出a0,a1,a2,...,a(n-1)。

輸出:圖形的邊數。

我個人已經在下面編寫了可以正常工作的代碼,但是我正在尋找一種不會檢查兩個頂點的更快算法。

例如,如果時間限制為0.5秒,則這不是一個好的算法。

#include<stdio.h>
int main(){
    long long int a[5000],n,i,j,edge=0;
    scanf("%lld",&n);
    for(i=0;i<n;i++){
        scanf("%lld",&a[i]);
    }
    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++){
            if(a[i]-a[j]==1 || a[i]-a[j]==-1){
                edge=edge+1;
            }
        }
    }
    printf("%lld",edge);
}

我有一個想法,我認為它可以幫助加快進度,但是我不知道如何編寫代碼:我認為,如果我們可以計算出一個常數k,那么有多少ai等於k,然后將它們放入另一個數組可以使檢查的速度更快,例如,如果n = 12並且ai為1,2,4,5,4,5,5,6,7,7,7,7 1,一個2,兩個4,三個5,一個6和四個7,因此這些相等的AI不需要與其他值進行多次檢查。

如果OP的代碼確實正確,則頂點標簽k不是唯一的,並且許多不同的頂點可以具有相同的標簽。

假設您有一個數組n ,其中包含100,002個無符號整數,其編號從0到100,001(含0和100,001),並且每個數組都能夠表示0到5,000的值。 將它們全部初始化為零。

添加標記為k的頂點時,將無符號整數n [ k ]遞增。 如果n [ k -1] + n [ k +1]為非零,則添加此頂點將創建許多新邊。

如果計算創建的邊數,則在添加最后一個頂點后立即得到結果。


如果頂點標簽是唯一的,但可能(錯誤)有重復的標簽k被忽略,則:

假設您有一個數組,包含100,002個標志,編號從0到100,001(含0和100),並且初始化為全清除。

每當看到標記為k的頂點時,請檢查標志k是否已設置。 如果是,則這是一個重復標記,將被忽略。

否則,設置標志,並檢查標志k -1和k +1。 如果設置了其中一個,則創建了一個新邊;否則,將創建一個新邊。 如果同時設置了兩個標志,則創建了兩個新邊。 如果兩個都清除,則不會創建新的邊。

如果計算創建的邊數,則在添加最后一個頂點后立即得到結果。

好吧,我終於找到了一個很好的算法。感謝您的幫助。 這是我的代碼:

#include<stdio.h>
int main(){
long long int a[100000],b[100002]={0},n,i,j,edge=0;
scanf("%lld",&n);
for(i=0;i<n;i++){
    scanf("%lld",&a[i]);
    b[a[i]]++;
}
for(i=1;i<100002;i++){
    edge=edge+b[i]*b[i-1];
}
printf("%lld",edge);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM