1 条题解

  • 0
    @ 2018-11-09 08:10:36

    #include<bits/stdc++.h>
    #define MAXN 100010
    #define MAXM 200010
    using namespace std;
    long long last[MAXN],to[MAXM],nex[MAXM],v[MAXM],cnt=0,dis[MAXN];
    bool vis[MAXN];
    long long n,m,s,t;
    void add(int x,int y,int w)
    {
    nex[++cnt]=last[x];//上一条边的编号
    to[cnt]=y;//此边到哪个点
    v[cnt]=w;//权值
    last[x]=cnt;//以x开头的最后一条边的编号
    }
    priority_queue< pair<int,int> > q;
    void dijkstra(int s)
    {
    for(int i=1;i<=n;i++) dis[i]=2147483647;//其实这样也可以,因为会自己更新的
    dis[s]=0;
    q.push(make_pair(0,s));//放入初始节点
    while(!q.empty())//还未遍历完
    {
    int x=q.top().second;//堆头节点,最小节点编号
    q.pop();//用过弹出
    if(vis[x]) continue;//已拓展的就不要再做了
    vis[x]=1;
    for(int i=last[x];i;i=nex[i])//拓展
    {
    int y=to[i];//下一个点
    if(dis[y]>dis[x]+v[i])
    {
    dis[y]=dis[x]+v[i];
    q.push(make_pair(-dis[y],y));//用相反数实现小根堆,放入堆
    }
    }
    }
    }
    int main()
    {
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
    int x,y,z;
    cin>>x>>y>>z;
    add(x,y,z);//单向边
    }
    cin>>s>>t;
    dijkstra(s);
    if (dis[t]!=2147483647) cout<<dis[t]<<endl;else cout<<-1<<endl;
    return 0;
    }

  • 1

图结构练习 - 最短路(大规模数据)

信息

难度
7
分类
图结构 | 最短路 点击显示
标签
(无)
递交数
98
已通过
16
通过率
16%
上传者