トピックリンクポータル
付属の
後でタイトル(エスケープ)を添付し、少し怠惰ではありません
全体のコードの難易度:★★
SPFAは困難を考える:★☆
保存方法は、難易度を考える:★★★
読むには、ほとんどのタイトルを読んでいません
最初の行は三つの整数を有します2 <= N <= 100,1 <= A、B <= N、それぞれ、接合部の数、およびトラム開始点、終了点。
あなたは使用することができます が、私はまだ練習の練習をしたいです
もちろん、私は使用しませんでした
私たちは、質問に来てみましょう:
この質問は、実際にしている
デフォルトのスイッチ持っている価値が置か0
デフォルトなしスイッチの値が入れ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;
}