luogu P1346 [トラム] SPFA

トピックリンクポータル

付属の

後でタイトル(エスケープ)を添付し、少し怠惰ではありません


全体のコードの難易度:★★
SPFAは困難を考える:★☆
保存方法は、難易度を考える:★★★

読むには、ほとんどのタイトルを読んでいません

最初の行は三つの整数を有します2 <= N <= 100,1 <= A、B <= N、それぞれ、接合部の数、およびトラム開始点、終了点。

あなたは使用することができます F リットル インクルード D フロイド が、私はまだ練習の練習をしたいです S P F A SPFA

もちろん、私は使用しませんでした S T L STL


私たちは、質問に来てみましょう:

この質問は、実際にしている
デフォルトのスイッチ持っている価値が置か0
デフォルトなしスイッチの値が入れ1は、
内蔵され、隣接するテーブル
の最後のランニング側を S P F A SPFA

ここに画像を挿入説明
しかし、
我々はまだに注意を払う必要に
出力されるように、最初から最後まで行きません - 1 -1
Jiuhaolaを解決しよう!

	memset(dis,100,sizeof(dis));
	if(dis[zd]==1684300900)
	  cout<<-1;
	else
	  cout<<dis[zd];

すべてのコード:

#include<iostream>
#include<cstring>
using namespace std;
int n,qd,zd,m,b,dl[1111000];
int dis[11110],v[11110];
int hd[11110],tot;
struct node
{
	int x,to,w,next;
}e[11110];
void ljb(int x,int y,int z)                         //建立邻接表
{
	e[++tot].x=x;
	e[tot].to=y;
	e[tot].w=z;
	e[tot].next=hd[x];
	hd[x]=tot;
}
int spfa(int x)                                //跑SPFA
{
	int head=0,tail=1;
	dis[x]=0,dl[1]=x,v[x]=1;
	while(head<=tail)
	{
		head++;
		int x1=dl[head];
		for(int i=hd[x1];i;i=e[i].next)
		 if(dis[x1]+e[i].w<dis[e[i].to])
		  {
		  	dis[e[i].to]=dis[x1]+e[i].w;
		  	if(!v[e[i].to])
		  	 {
		  	 	tail++;
		  	 	v[e[i].to]=1;
		  	 	dl[tail]=e[i].to;
		  	 }
		  }
		v[x1]=0;
	}
}
int main()
{
	cin>>n>>qd>>zd;
	memset(dis,100,sizeof(dis));
	for(int i=1; i<=n; i++)
	 {
	 	cin>>m;
	 	for(int j=1; j<=m; j++)
	 	 {
	 	 	cin>>b;
	 	 	if(j==1)
	 	 	  ljb(i,b,0);                     //默认开关放0
	 	 	else
	 	 	  ljb(i,b,1);                     //其余放1
	 	 }
	 }
	spfa(qd);
	if(dis[zd]==1684300900)            //注意memset(...100...)我这里输出的是1684300900
	  cout<<-1;
	else
	  cout<<dis[zd];
	return 0;
}
公開された37元の記事 ウォン称賛11 ビュー1247

おすすめ

転載: blog.csdn.net/Jackma_mayichao/article/details/103998689