1382:最短路(Spfa)

1382:最短路(Spfa)

时间限制: 1000 ms         内存限制: 65536 KB

提交数: 5653     通过数: 1599

【题目描述】

给定 MM 条边, NN 个点的带权无向图。求 11到 NN 的最短路。

【输入】

第一行:N,M(N≤100000,M≤500000)N,M(N≤100000,M≤500000);

接下来MM行33个正整数:ai,bi,ci表示ai,bi之间有一条长度为ci的路,ci≤1000ai,bi,ci表示ai,bi之间有一条长度为ci的路,ci≤1000。

【输出】

一个整数,表示 11 到 NN 的最短距离。

【输入样例】

4 4

1 2 1

2 3 1

3 4 1

2 4 1

【输出样例】

2

【提示】

【样例解释】

注意图中可能有重边和自环,数据保证 11 到 NN 有路径相连。


思路:spfa,我这里犯了个小错误,花了我1h找一找('__')。

#include <bits/stdc++.h>

using namespace std;

int n,m,x,y,z,dis[100005];

bool vis[100050];

struct wow

{

  int num,di;

};

vector <wow> b[100005];

int main()

{

  cin>>n>>m;

  for(int i=1; i<=m; i++)

  {

    scanf("%d%d%d",&x,&y,&z);

    wow c;

    if(x!=y)//排除自环

    {

      c.num=x;

      c.di=z;

      b[y].push_back(c);

      c.num=y;

      b[x].push_back(c);

    }

  }//输入

  queue<int> q;

  memset(dis,0x3f,sizeof(dis));

  dis[1]=0;//初值

  vis[1]=1;//访问过

  q.push(1);

  while(!q.empty())

  {

    int c=q.front();

    q.pop();

    vis[c]=0;

    for(int i=0; i<b[c].size(); i++)

    {

      wow d=b[c][i];

      if(dis[d.num]>d.di+dis[c])

      {

        dis[d.num]=d.di+dis[c];

        if(vis[d.num]==0)

        {

          vis[d.num]=1;

          q.push(d.num);

        }

      }

    }

  }//spfa

  cout<<dis[n]<<endl;//输出

  return 0;

}


Simon说:

好久前写的文章,我欠的债……今天才发。

说声对不起哦,好久没写了。

不过,我会补上的……

风萧萧兮易水寒,欠了债兮你要还。

我会还的('_')。

再见。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容