1. 程式人生 > >hdu1874 暢通project續 最短路 floyd或dijkstra或spfa

hdu1874 暢通project續 最短路 floyd或dijkstra或spfa

編號 n) names 能夠 包括 多少 var ews 數據

Problem Description
某省自從實行了非常多年的暢通project計劃後。最終修建了非常多路。只是路多了也不好,每次要從一個城鎮到還有一個城鎮時,都有很多種道路方案能夠選擇。而某些方案要比還有一些方案行走的距離要短非常多。這讓行人非常困擾。

如今,已知起點和終點。請你計算出要從起點到終點,最短須要行走多少距離。

Input
本題目包括多組數據,請處理到文件結束。
每組數據第一行包括兩個正整數N和M(0< N<200,0 < M<1000),分別代表現有城鎮的數目和已修建的道路的數目。

城鎮分別以0~N-1編號。


接下來是M行道路信息。每一行有三個整數A,B,X(0<=A,B < N,A!=B,0< X <10000),表示城鎮A和城鎮B之間有一條長度為X的雙向道路。


再接下一行有兩個整數S,T(0<=S,T < N),分別代表起點和終點。

Output
對於每組數據,請在一行裏輸出最短須要行走的距離。假設不存在從S到T的路線,就輸出-1.

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

Sample Output
2
-1

Author
linle

Source
2008浙大研究生復試熱身賽(2)——全真模擬

起點到終點的最短路 這裏給出3種算法。Floyd。dijkstra和spfa
從提交的代碼得速度來看。dijkstra>spfa>Floyd
可是別人都說spfa最快。。。(我就不知道了)
folyd不推薦使用。由於他最慢。,數據大一點的話更不行。

。(只是他最簡單)
(1)Floyd

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#pragma comment(linker,"/STACK:102400000,102400000")
#define pi acos(-1.0)
#define EPS 1e-6
#define INF (1<<28) using namespace std; int cost[205][205]; bool used[205]; int n,m; int d[205]; void floyd() { for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) cost[i][j]=min(cost[i][j],cost[i][k]+cost[k][j]); } int main() { while(scanf("%d %d",&n,&m)!=EOF) { int i,j; for(i=0;i<n;i++) { cost[i][i]=0; for(j=0;j<n;j++) { if(i!=j) cost[i][j]=INF; } } int a,b,value,start,endl; for(i=0;i<m;i++) { scanf("%d %d %d",&a,&b,&value); if(cost[a][b]>value) cost[a][b]=cost[b][a]=value; //多條路的情況。

} scanf("%d %d",&start,&endl); floyd(); if(cost[start][endl]!=INF) printf("%d\n",cost[start][endl]); else printf("-1\n"); } return 0; }

2:dijkstra

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#pragma comment(linker,"/STACK:102400000,102400000")
#define pi acos(-1.0)
#define EPS 1e-6
#define INF (1<<28)
using namespace std;

int cost[205][205];
bool used[205];
int n,m;
int d[205];
void dijkstra(int s)
{
    fill(d,d+n,INF);
    fill(used,used+n,false);
    d[s]=0;
    while(true)
    {
        int v=-1;
        for(int u=0;u<n;u++)
        {
            if(!used[u]&&(v==-1||d[u]<d[v])) v=u;
        }
        if(v==-1) break;
        used[v]=true;
        for(int u=0;u<n;u++)
        {
            d[u]=min(d[u],d[v]+cost[v][u]);
        }
    }
}
int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        int i,j;
        for(i=0;i<n;i++)
        {
            cost[i][i]=0;
            for(j=0;j<n;j++)
            {
                if(i!=j) cost[i][j]=INF;
            }
        }
        int a,b,value,start,endl;
        for(i=0;i<m;i++)
        {
            scanf("%d %d %d",&a,&b,&value);
            if(cost[a][b]>value) cost[a][b]=cost[b][a]=value; //多條路的情況。

} scanf("%d %d",&start,&endl); dijkstra(start); if(d[endl]!=INF) printf("%d\n",d[endl]); else printf("-1\n"); } return 0; }

3:spfa

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#pragma comment(linker,"/STACK:102400000,102400000")
#define pi acos(-1.0)
#define EPS 1e-6
#define INF (1<<28)
using namespace std;

int cost[205][205];
bool used[205];
int n,m;
int d[205];
void SPFA(int src,int des)
{
    int i;
    for(i=0;i<n;i++) d[i]=INF;
    memset(used,false,sizeof(used));

    queue<int> myqueue;
    while(!myqueue.empty()) myqueue.pop();//清空隊列

    d[src]=0;
    used[src]=1;
    myqueue.push(src);
    int tmp;
    while(!myqueue.empty())
    {
        tmp=myqueue.front();
        myqueue.pop();
        used[tmp]=0;
        for(i=0;i<n;i++)
            if(d[i]>d[tmp]+cost[tmp][i])
            {
                d[i]=d[tmp]+cost[tmp][i];
                if(!used[i])
                {
                    used[i]=1;
                    myqueue.push(i);
                }
            }
    }
}

int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        int i,j;
        for(i=0;i<n;i++)
        {
            cost[i][i]=0;
            for(j=0;j<n;j++)
            {
                if(i!=j) cost[i][j]=INF;
            }
        }
        int a,b,value,start,endl;
        for(i=0;i<m;i++)
        {
            scanf("%d %d %d",&a,&b,&value);
            if(cost[a][b]>value) cost[a][b]=cost[b][a]=value; //多條路的情況。
        }
        scanf("%d %d",&start,&endl);
        SPFA(start,endl);
        if(d[endl]!=INF) printf("%d\n",d[endl]);
        else printf("-1\n");
    }
    return 0;
}

hdu1874 暢通project續 最短路 floyd或dijkstra或spfa