求助!!!!!!!!!!
查看原帖
求助!!!!!!!!!!
312743
phelixzhen楼主2021/1/27 15:18

蒟蒻求助~~~~~~~~~

#include<bits/stdc++.h>
using namespace std;
struct edge{
    int next,to,w;
};
edge make(int next,int to,int w)
{
    edge cur;cur.next=next;cur.to=to;cur.w=w;return cur;
}
vector<edge> g;
vector<int> head,dis;
vector<bool> vis;
int n,m,s,cnt;
template<typename T>
void read(T &x)
{
    x=0;
    register int f=1;
    register char c=getchar();
    while(!isdigit(c))
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(isdigit(c))
    {
        x=(x<<3)+(x<<1)+c-'0';
        c=getchar();
    }
    x*=f;
}
template<typename T>
inline void write(T x)
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x>=10) write(x/10);
    putchar(x%10+'0');
}
void add(int u,int v,int w)
{
    g.push_back(make(head[u],v,w));
    ++cnt;
    head[u]=cnt;
}
int main()
{
    read(n);read(m);read(s);
    for(int i=0;i<=n;++i)
    {        
        dis.push_back(2147483647);
        vis.push_back(0);
        head.push_back(0);                      //dis[i]表示下标为i的点到出发点s的最短路径   vis染色 
    }
    dis[s]=0;
    int u,v,w;
    g.push_back(make(0,0,0));
    for(int i=1;i<=m;++i)
    {
        read(u);read(v);read(w);
        add(u,v,w);
    }
    int pnt=s,minn=2147483647;
    while(!vis[pnt])
    {
        vis[pnt]=1;
        for(int i=head[pnt];i;i=g[i].next)
            if(!vis[g[i].to]&&dis[g[i].to]>dis[pnt]+g[i].w)
                dis[g[i].to]=dis[pnt]+g[i].w;
        for(int i=1;i<=n;++i)
            if(!vis[i]&&dis[i]<minn)
            {
                minn=dis[i];
                pnt=i;
            }
    }
    for(int i=1;i<=n;++i)
    {
        write(dis[i]);
        putchar(' ');
    }
    return 0;
}``

2021/1/27 15:18
加载中...