蒟蒻刚学Dijkstra,样例都没过,求助QAQ
查看原帖
蒟蒻刚学Dijkstra,样例都没过,求助QAQ
218736
Clear_yu楼主2020/7/2 17:34

RT,用了vector存图和优先队列优化,求大佬查错

#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const int INF=1e7;
struct edge 
{
    int from,to,dis;
    edge(int u,int v,int d){from=u;to=v;dis=d;}
};
vector<edge>pt[200010];
int dis[100010];
bool vis[100010];
int n,m,s;
struct node
{
    int id,dis;
    node(int idd,int diss){id=idd,dis=diss;} 
    bool operator <(const node &x) const 
    {
        return dis > x.dis;
    }
};
inline void dijkstra(int x)
{
    for(int i=1;i<=n;i++)
    dis[i]=INF;
    dis[x]=0;
    priority_queue<node>q;
    q.push(node(x,dis[x]));
    while(!q.empty())
    {
        node k=q.top();
        int ee=k.id;
        q.pop();
        if(vis[ee]) continue;
        vis[ee]=1;
        for(int i=0;i<pt[ee].size();i++)
        {
            edge y=pt[ee][i];
            if(vis[y.to]) continue;
            if(dis[y.to]>dis[ee]+k.dis)
            {
                dis[y.to]=dis[ee]+k.dis;
                q.push(node(y.to,dis[y.to]));
            }
        }
    }
}
int main()
{
    cin>>n>>m>>s;
    for(int i=1;i<=n;i++)
    {
        int u,v,d;
        scanf("%d%d%d",&u,&v,&d);
        pt[u].push_back(edge(u,v,d));
        pt[v].push_back(edge(v,u,d));
    }
    dijkstra(s);
    for(int i=1;i<=n;i++)
    printf("%d ",dis[i]);
    return 0;
}
2020/7/2 17:34
加载中...