/*题意就是说从节点为1走到节点为n的节点花的时间最短;
这个题很明显就是最短路的一些知识了,用dijkstra水水的就过去了;
然后呢就这个题目来说一下关于我对dijkstra的看法;这个东西呢就是计算单源最短路(从某个点到某一个点的最短时间);
这个我们先将源头节点视为0(开始走的时间为0),其余的为inf(无穷);在n次循环中,我们在每一个未标记的节点中,选出达到这个点所花的
最小时间的位置,再给予该位置进行标记,再从该位置出发更新它所有边的时间;
这里有一个松弛操作,说白了就是将时间复杂度降低一点,但是个人感觉为没什么卵用;
这个松弛操作以后继续说吧
*/
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=1<<29;
const int maxn=1e3+7;
int mmp[maxn][maxn];///地图兼权值记录;
bool vis[maxn];
int lowcost[maxn];///表示到达某个节点的最短开销;
void dijkstra(int n)
{
for(int i=1;i<=n;i++)///进行初始化一下;
{
lowcost[i]=inf;
vis[i]=false;
}
lowcost[1]=0;///从1开始走嘛;记录当前节点所花时间为0;
for(int j=1;j<=n;j++)
{
int k=-1,Min=inf;
for(int i=1;i<=n;i++)
if(!vis[i]&&lowcost[i]<Min)
{
Min=lowcost[i];
k=i;
}
///找到未标记的时间最短的节点。
if(k==-1) break;///未找到就直接break;
vis[k]=true;
for(int i=1;i<=n;i++)///从该节点引申到与它相邻的所有节点(相邻边,不断更新最小值);
if(!vis[i]&&lowcost[k]+mmp[k][i]<lowcost[i])
lowcost[i]=lowcost[k]+mmp[k][i];
}
return ;
}
int main ()
{
int n,t;
scanf("%d %d",&t,&n);
int x,y,w;
memset(mmp,0,sizeof(mmp));
memset(vis,0,sizeof(vis));
memset(lowcost,0,sizeof(lowcost));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mmp[i][j]=inf;
for(int i=1;i<=t;i++)
{
scanf("%d %d %d",&x,&y,&w);
if(w<mmp[x][y])///可能有重边的出现,咋们得取最小的进行计算,所以我们将mmp[][]存在于无向图的节点权值为无穷
{
mmp[x][y]=w;
mmp[y][x]=mmp[x][y];
}
}
dijkstra(n);
printf("%d\n",lowcost[n]);
return 0;
}
Dijkstra POJ - 2387
最新推荐文章于 2020-06-28 16:45:37 发布