51nod1459【二级最短路】

    xiaoxiao2023-03-24  3

    标签说的是BFS。。。 太菜,不知道怎么BFS。。。是不是spfa写,就叫BFS。。。感觉不是。。。。 只是二级最短路的写法,直接搞就很容易了,简单题;

    #include <bits/stdc++.h> using namespace std; typedef long long LL; const int INF=0x3f3f3f3f; const int N=5e2+10; int val[N]; struct asd{ int w; int to; int next; }; asd q[N*N]; int head[N*N],tol,dis[N],d[N]; int n,m,s,t; bool vis[N]; queue<int>e; void spfa() { while(!e.empty()) e.pop(); for(int i=0;i<n;i++) { dis[i]=INF; d[i]=0; vis[i]=false; } d[s]=val[s]; dis[s]=0; vis[s]=true; e.push(s); while(!e.empty()) { int u=e.front();e.pop(); vis[u]=0; for(int v=head[u];v!=-1;v=q[v].next) { int i=q[v].to; if(dis[i]>dis[u]+q[v].w) { dis[i]=dis[u]+q[v].w; d[i]=d[u]+val[i]; if(!vis[i]) { vis[i]=1; e.push(i); } } else if(dis[i]==(dis[u]+q[v].w)) { if(d[i]<d[u]+val[i]) d[i]=d[u]+val[i]; } } } printf("%d %d\n",dis[t],d[t]); } void add(int a,int b,int c) { q[tol].to=b; q[tol].w=c; q[tol].next=head[a]; head[a]=tol++; } void init() { memset(head,-1,sizeof(head)); tol=0; } int main() { scanf("%d",&n); scanf("%d",&m); scanf("%d%d",&s,&t); for(int i=0;i<n;i++) scanf("%d",&val[i]); init(); while(m--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } spfa(); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1202022.html
    最新回复(0)