HDU 2544 最短路( Dijkstra模板題/SPFA初學)

最短路

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 36086    Accepted Submission(s): 15700


Problem Description
在每年的校賽裏,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?

 

Input
輸入包括多組數據。每組數據第一行是兩個整數N、M(N<=100,M<=10000),N表示成都的大街上有幾個路口,標號爲1的路口是商店所在地,標號爲N的路口是賽場所在地,M則表示在成都有幾條路。N=M=0表示輸入結束。接下來M行,每行包括3個整數A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A與路口B之間有一條路,我們的工作人員需要C分鐘的時間走過這條路。
輸入保證至少存在1條商店到賽場的路線。
 

Output
對於每組輸入,輸出一行,表示工作人員從商店走到賽場的最短時間
 

Sample Input
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
 

Sample Output
3 2
 

Source
 


解題思路:

裸裸的Dijkstra的模板題,什麼變化都沒有,直接上就好了。

代碼:

# include<cstdio>
# include<iostream>

using namespace std;

# define MAX 100+4
# define inf 99999999

int edge[MAX][MAX];
int dis[MAX];
int book[MAX];
int n,m;
int u,v;

void init()
{
    for ( int i = 1;i <= n;i++ )
    {
        for ( int j = 1;j <= n;j++ )
        {
            if ( i==j )
            {
                edge[i][j] = 0;
            }
            else
            {
                edge[i][j] = inf;
            }
        }
    }
}

void input()
{
    for ( int i = 1;i <= m;i++ )
    {
        int t1,t2,t3;
        cin>>t1>>t2>>t3;
        edge[t1][t2] = edge[t2][t1] = t3;
    }
}

void Dijkstra()
{
    for ( int i = 1;i <= n;i++ )
    {
        dis[i] = edge[1][i];
        book[i] = 0;
    }
    dis[1] = 0;
    book[1] = 1;
    int _min;

    for ( int i = 1;i <= n-1;i++ )
    {
        _min = inf;
        for ( int j = 1;j <= n;j++ )
        {
            if ( book[j]==0&&dis[j] < _min )
            {
                _min = dis[j];
                u = j;
            }
        }

        book[u] = 1;
        for ( v = 1;v <= n;v++ )
        {
            if ( book[v] == 0 && dis[v] > dis[u]+edge[u][v] )
            {
                dis[v] = dis[u] + edge[u][v];
            }
        }


    }

}


int main(void)
{
    while ( cin>>n>>m )
    {
        if ( n==0&&m==0 )
            break;
        init();
        input();
        Dijkstra();
        printf("%d\n",dis[n]);
    }
}

由於剛學SPFA,故用SPFA來解決下,,,因爲SPFA的複雜度是O(E),而Dijkstra的複雜度是O(ElogV),SPFA還是相當快的。。。用SPFA的時候,queue可以用STL中的,也可以用數組來模擬,兩個差不多,習慣那個用哪個吧。。。。有關SPFA的詳細介紹,在後面的blog中還會陸續更新的。。。

# include<cstdio>
# include<iostream>
# include<queue>

using namespace std;

# define MAX 100+4
# define inf 99999999

int edge[MAX][MAX];
int dis[MAX];
int book[MAX];
int n,m;
int ans;
queue<int>q;

void init()
{
    for ( int i = 1;i <= n;i++ )
    {
        for ( int j = 1;j <= n;j++ )
        {
            if ( i==j )
            {
                edge[i][j] = 0;
            }
            else
            {
                edge[i][j] = inf;
            }
        }
    }
}

void input()
{
    for ( int i = 1;i <= m;i++ )
    {
        int t1,t2,t3;
        cin>>t1>>t2>>t3;
        edge[t1][t2] = edge[t2][t1] = t3;
    }
}

int spfa ( int x )
{
    for ( int i = 1;i <= n;i++ )
    {
        book[i] = 0;
        dis[i] = inf;
    }

    q.push(x);
    book[x] = 1;
    dis[x] = 0;

    while ( !q.empty() )
    {
        int cur = q.front();
        q.pop();
        for ( int i = 1;i <= n;i++ )
        {
            if ( dis[i] > dis[cur] + edge[cur][i] )
            {
                dis[i] = dis[cur] + edge[cur][i];
                if ( book[i] == 0 )
                {
                    book[i] = 1;
                    q.push(i);
                }
            }
            
        }
         book[cur] = 0;

    }
    
    return dis[n];
}


int main(void)
{
    while ( cin>>n>>m )
    {
        if ( n==0&&m==0 )
            break;
        init();
        input();
        ans = spfa( 1 );
        printf("%d\n",ans);
    }


    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章