NOIP 2012 普及組 複賽 culture 文化之旅

mrcrack發表於2017-03-04

NOIP 2012 普及組 複賽 culture 文化之旅

1.找尋迪傑斯特拉(Dijkstra)演算法,難度適中,過程中,找到該題。

2.結合題意,弄懂輸入輸出樣例是關鍵一步。

3.為了能解決2,紙筆是必須的。

4.讀該題樣例輸入部分,感覺有點象棧,需要相當的記憶。程式設計,對鍛鍊大腦,棧的記憶,有很大作用。

5.該題的資料比較水,n<=100,n^2<=10000,所以超時一般不會。

6.該題可以看作有條件約束的最短路徑。

7.該題的難想之處,在於將aij=1轉化為,兩國之間路徑為INF。

8.可採用Dijkstra演算法,但Floyd演算法寫起來更簡單。

9.因其起點,終點位置未定,故綜合考慮,採用Floyd演算法。

10.此題需注意的一句:距離為 d 的可雙向通行的道路。請注意雙向兩字。

11.還有一句需注意:aij= 1 表示文化 i 排斥外來文化 j。請注意外來兩字。

12.該題需注意,一番資料處理後,還是迴歸基本的最短路徑問題。

附上AC程式碼,編譯環境Dev-C++4.9.9.2

#include <stdio.h>
#define INF 999999
int main(){
    int n,k,m,s,t;
    int c[100+10];
    int a[100+10][100+10];
    int e[100+10][100+10];
    int i,j,q;
    int u,v,w;
    scanf("%d%d%d%d%d",&n,&k,&m,&s,&t);
    for(i=1;i<=n;i++)
        scanf("%d",&c[i]);
    for(i=1;i<=k;i++)
        for(j=1;j<=k;j++)
            scanf("%d",&a[i][j]);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++){
            if(i==j)
                e[i][j]=0;
            else
                e[i][j]=INF;
        }
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&u,&v,&w);
        e[u][v]=w;
        e[v][u]=w;
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i!=j&&a[c[j]][c[i]]==1)
                e[i][j]=INF;
    for(q=1;q<=n;q++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(e[i][j]>e[i][q]+e[q][j])
                    e[i][j]=e[i][q]+e[q][j];
    if(e[s][t]<INF)
        printf("%d\n",e[s][t]);
    else
        printf("-1\n");
    return 0;
}

相關文章