極めてシンプルな最短回路紀中2051_spfa

3549 ワード

タイトルの説明
 C    X   ,         ,   X        ,             X    1,               ,   X           1         ,          C,                    。

最初はXちゃんが1番でNポイント、Mロード、映画館はTポイントでした.
入力
最初の行は3つの正の整数で、それぞれn,m,t以下のm行で、行ごとに3つの数で、接続の番号と重み値を表します(ただし、重いエッジがある可能性があります)
しゅつりょく
1行1個の数で、1からtの最短ルートを表す
データ範囲
30%:n<=10 m<=20 60%: n<=1000 m<=20000 100%: n<=5000000 m<=10000000
問題解
テーマがこんなにはっきりしているのに何が言いたいのか|--|直接エッジをつなぎ、spfaを1回走ればいいデータが水すぎる?どうせ最初の配列が小さくても過ぎたのが一番速い
コード#コード#
#include 
#include 
using namespace std;
struct edge
{
    int x,y,w,next;
};
queue<int>q;
edge e[20000001];
bool v[5000001];
int ls[20000001],dis[5000001];
int maxE=0;
void add(int x,int y,int w)
{
    e[++maxE]=(edge){x,y,w,ls[x]};
    ls[x]=maxE;
}
int main()
{
    freopen("short.in","r",stdin);
    freopen("short.out","w",stdout);
    int n,m,ed;
    scanf("%d%d%d",&n,&m,&ed);
    for (int i=1;i<=n;i++)
        dis[i]=1<<30;
    dis[1]=0;
    for (int i=1;i<=m;i++)
    {
        int x,y,w;
        scanf("%d%d%d",&x,&y,&w);
        add(x,y,w);
        add(y,x,w);
    }
    q.push(1);
    while (!q.empty())
    {
        int now=q.front();q.pop();
        for (int i=ls[now];i;i=e[i].next)
            if (e[i].w+dis[now]if (!v[e[i].y])
                {
                    q.push(e[i].y);
                    v[e[i].y]=true;
                }
            }
        v[now]=false;
    }
    printf("%d
"
,dis[ed]); return 0; }