您的位置:首页 > 其它

(ssl 1346)电车

2018-01-13 14:41 155 查看
因为第一个数字不用切换开关,so 后面的权值为1

所以

spfa start

#include <cstdio>
using namespace std;
struct lo{
int u,v,w,next;
}a[10001];
int m,n,l,r,t,q,x,d[101],list[101],ls[101];
bool v[101];
void add(int i,int x,bool go){
a[++m].u=i; a[m].v=x; a[m].w=go;
a[m].next=ls[a[m].u];
ls[a[m].u]=m;
}
void spfa(int st){
int head=0,tail=1;
for (int i=1;i<=n;i++) d[i]=2147483647;
list[1]=st; v[st]=1; d[st]=0;
do{
head++;
if (head>n) head=1;
t=ls[list[head]];
while (t>0){
if (d[a[t].u]+a[t].w<d[a[t].v]){
d[a[t].v]=d[a[t].u]+a[t].w;
if (!v[a[t].v]){
v[a[t].v]=1;
tail++;
if (tail>n) tail=1;
list[tail]=a[t].v;
}
}
t=a[t].next;
}
v[list[head]]=0;
}while (head!=tail);
if (d[r]!=2147483647) printf("%d",d[r]); else printf("-1");
}
int main(){
scanf("%d%d%d",&n,&l,&r);
for (int i=1;i<=n;i++){
scanf("%d",&q);
for (int j=1;j<=q;j++)
scanf("%d",&x),add(i,x,(j>1));
}
spfa(l);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: