HDU 1874 暢通工程續
暢通工程續
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10327 Accepted Submission(s): 3451
Problem Description
某省自從實行了很多年的暢通工程計劃後,終於修建了很多路。不過路多了也不好,每次要從一個城鎮到另一個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。
現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。
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
2012-04-07 09:31:33| 分類: 最短路問題|舉報|字號 訂閱
最短路徑問題(Dijkstar算法)
算法分析
和"HDU 2544 最短路"(http://qianmacao.blog.163.com/blog/static/203397180201236114656481/)完全一樣,不再贅述。
詳情見文章“最短路徑算法—Dijkstra(迪傑斯特拉)算法分析與實現”。
代碼如下:
#include<iostream>
using namespace std;
const int mmax=2000000;
int dist[200]/*表示當前點到源點的最短路徑長度*/,c[200][200];// 記錄圖的兩點間路徑長度
void Dijkstar(int n,int v)
{
bool s[200];//判斷是否已存入該點到S集合中
int i,j;
for(i=0;i<n;i++)
{
s[i]=0; // 初始都未用過該點
dist[i]=c[v][i];//存入當前點 到源點的路徑長
}
s[v]=1;//源點存入到s集合中
dist[v]=0;//源點到源點的路徑長爲0
for(i=1;i<n;i++)
{
int temp=mmax; //轉換賦值,防止混亂
int u=v;
for(j=0;j<n;j++)//遍歷所有的點,找到和起點相連的點
{
if(!s[j]&&dist[j]<temp)//如果j沒有存在,並且j 到源點的值小於已經存在的值
{
temp=dist[j];//取小的路徑長
u=j;//起點轉換
}
}
s[u]=1;//起點存入到s集合中
for(j=0;j<n;j++)//遍歷所有的點 ,尋找和新起點相連而且不是在已經在s集合中的點,
{
if(!s[j]&&c[u][j]+dist[u]<dist[j])//如果j沒有存入到s的集合中,並且查找當前點到起始點的最小路徑
{
dist[j]=dist[u]+c[u][j];//取更小的路徑長
}
}
}
}
int main()
{
int n,m,s,t;
int a,b,x,i,j;
while(cin>>n>>m)
{
for(i=0;i<n;i++)//初始賦值,把所有的端點都賦值
{
for(j=0;j<n;j++)
if(i==j)
c[i][j]=0;//本身到本身距離爲零
else
c[i][j]=mmax;//其餘的全部設置爲最大值,方便後面判斷,更改
}
for(i=0;i<m;i++)//讀入已經有路的信息,權值、端點
{
cin>>a>>b>>x;//讀入兩個端點,以及兩個端點的距離
if(x<c[a][b])//有重邊,也就是判斷是否有相同的路徑,如果有相同的,取最小的路徑替換已有的路徑長
{
c[a][b]=c[b][a]=x;
}
}
for(i=0;i<n;i++)//初始當前點到源點的最短路徑長度
{
dist[i]=mmax;//全部設置爲最大值
}
cin>>s>>t;//讀入源點和終結點
Dijkstar(n,s);//調用算法 ,將端點個數和源點輸入到所調用的函數中
if(dist[t]==mmax)//如果還是沒有路徑的話,
cout<<"-1"<<endl;//輸出1
else
cout<<dist[t]<<endl;//如果有的話,輸出最短路徑長度
}
return 0;
}