極めてシンプルな最短回路紀中2051_spfa
タイトルの説明
最初は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回走ればいいデータが水すぎる?どうせ最初の配列が小さくても過ぎたのが一番速い
コード#コード#
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;
}