• C


    题目链接:

             http://acm.hust.edu.cn/vjudge/contest/66569#problem/A

     题意:给你n个点,给出a到b的距离,a,b边是可以互想抵达的,求1到n的最短距离。实质:n个顶点m条边的无向图,求1到n的最短路径。

    问题:一开始结果没问题,提交时显示运行错误,改了一下变成了错误答案,但答案是正确的,最后参照别人的,改了好久终于过了,但是感觉还是有点问题没弄懂。dijkstra算法,感觉与prim算法十分相似,因为昨天刚学了prim算法,所以今天上手很快。

          昨天那个问题弄懂了,就是迪杰斯特拉算法需要考虑重边的情况。

    AC代码:

    #include <iostream>
    #include<cstdio>
    #include<cstring>
    #define MAX 100000
    using namespace std;
    int n,m,k;
    int g[1001][1001];
    int vis[1001];
    int dis[1001];
    void dijkstra()
    {
    int min;
    for(int i=1; i<=n; i++)
    dis[i]=g[1][i];
    vis[1]=1;//标记
    for(int i=1; i<=n; i++)
    {
    min=MAX;
    for(int j=1; j<=n; j++)
    if(!vis[j]&&dis[j]<min)
    {
    min=dis[j];
    k=j;
    }
    vis[k]=1;//已标记
    for(int j=1; j<=n; j++)
    if(!vis[j]&&dis[j]>g[k][j]+dis[k])//检验所有标记点k到未标记点j的距离,并取最小值
    dis[j]=g[k][j]+dis[k];
    }
    printf("%d ",dis[n]);
    }
    int main()
    {
    int a,b,c;
    while(~scanf("%d%d",&m,&n))
    {
    memset(vis,0,sizeof(vis));
    for(int i=1; i<=n; i++)
    for(int j=1; j<=n; j++)

    {

    if(i==j)
    g[i][i]=0;
    else g[i][j]=MAX;

    }

    for(int i=1; i<=m; i++)
    {
    scanf("%d%d%d",&a,&b,&c);
    if(g[a][b]>c)//没有这句if语句导致一直错就是过不了,没弄懂
    g[a][b]=g[b][a]=c;

    }
    dijkstra();
    }
    return 0;
    }

  • 相关阅读:
    时间格式
    分页1
    vs2010 VS2008 VS2005 快捷键大全
    css 常用标签
    JS Array数组操作
    CSS属性
    jquery 选择器大全
    @fontface
    以前写过的ajax基础案例(王欢huanhuan)
    Jquery操作下拉框(DropDownList)的取值赋值实现代码(王欢)
  • 原文地址:https://www.cnblogs.com/lbyj/p/5706257.html
Copyright © 2020-2023  润新知