求助,做吐了,迪杰斯特拉,三个点MLE
查看原帖
求助,做吐了,迪杰斯特拉,三个点MLE
259481
201901061111huo楼主2021/1/20 21:18
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
int main()
{
    ll a,b,c;
    ll n,m,s;
    ll d[10002][10002];
    ll inf=2147483647;
    ll f[10002];
    bool w[10002]={false};
    scanf("%d%d%d",&n,&m,&s);
    for(ll i=1;i<=n;i++)
    {
        for(ll j=1;j<=n;j++)
        {
            if(i!=j)
                d[i][j]=inf;
        }
        if(i!=s)
            f[i]=inf;
    }
    for(ll i=0;i<m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        c=min(c,d[a][b]);
        d[a][b]=c;
        if(a==s)
            f[b]=c;
    }
    ll cnt=1;
    w[s]=true;
    while(cnt!=n)
    {
        ll x,mmin=inf;
        for(ll i=1;i<=n;i++)
        {
            if(f[i]<mmin&&w[i]==false)
            {
                mmin=f[i];
                x=i;
            }
        }
        if(mmin==inf)
        {
            for(ll i=1;i<=n;i++)
            {
                if(w[i]==false)
                    f[i]=inf;
            }
            break;
        }
        w[x]=true;
        cnt++;
        for(ll i=1;i<=n;i++)
        {
            if(w[i]==false&&f[i]>(long long)(f[x])+(long long)(d[x][i]))
                f[i]=f[x]+d[x][i];
            if(f[i]>=inf)
                f[i]=inf;
        }
    }
    printf("%d",f[1]);
    for(ll i=2;i<=n;i++)
        printf(" %d",f[i]);
}


2021/1/20 21:18
加载中...