北京大学暑期课程期末考试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());
}