北京大學暑期課程期末考試G題,(Orz太菜了10多個題就弄了三個,這個題感覺被陰了,但還是英文太差的鍋)
最短路,Dijkstra的模板題
想說說現場賽(這個是假的)的感受,考前以爲老師到時候給的PPT會有這個算法的代碼版沒想到只有中文簡化形容版,本來四個小時的考試因爲交換機的故障也縮短成了兩個半小時,到這道題開始看的時候就有點着急犯蠢了(printf的時候想print dijkstra函數 沒想到忘加括號了 - -,最蠢的是考後看了羣裏討論才知道這個題輸入有坑,輸入有可能出現重邊情況,要進行判重,存儲邊值更小的,對英文不好的人實在太不友善了,還是應該自習讀一讀題啊
不過dijkstra模板對着中文概述還是寫對了,自己也挺高興的~
//g dijkstra
#include <iostream>
#include <cstring>
#define INF 999999
using namespace std;
int map[2005][2005];
int d[2005];//表示這個點到1的距離
int mark[2005];
int t,n;
int dijkstra()//最終可能要return dt
{
while(1)
{
int minv = INF;
int minindex = INF;
for(int i=1;i<=t;i++)
{
if(mark[i]==1)
{
continue;
}
if(d[i]<minv)
{
minv = d[i];
minindex = i;
}
}
if(minindex==INF)
{
return d[t];
}
int u = minindex;
mark[u] = 1;
for(int v=1;v<=t;v++)
{
if(mark[v]!=1&&map[u][v]!=0)
{
d[v] = min(d[v],d[u]+map[u][v]);
}
}
}
}
int main(void)
{
for(int i=0;i<2005;i++)
{
d[i] = INF;//初始化所有的距離爲無窮
}
memset(map,0,sizeof(map));
memset(mark,0,sizeof(mark));
scanf("%d%d",&n,&t);//從1到t的距離最小
for(int i=0;i<n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]==0)
{
map[a][b] = c;
map[b][a] = c;
}
else
{
if(c<map[a][b])
{
map[a][b] = c;
map[b][a] = c;
}
}
}
d[1] = 0;
printf("%d\n",dijkstra());
}