选择最佳线路(建立虚拟源点)

在这里插入图片描述

思路:问你从多个源点出发到终点的最短路线,那么我们建立一个虚拟源点和其他车站连起来权值为0,求从这个虚拟源点到终点的最短路

(记得初始化tot)。

代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
 
using namespace std;
typedef long long ll;
#define SIS std::ios::sync_with_stdio(false)
#define space putchar(' ')
#define enter putchar('\n')
#define lson root<<1
#define rson root<<1|1
typedef pair<int,int> PII;
typedef pair<int,PII> PIII;
const int mod=1e9+7;
const int N=2e5+5;
const int inf=0x7f7f7f7f;

int gcd(int a,int b)
{
    
    
    return b==0?a:gcd(b,a%b);
}
 
ll lcm(ll a,ll b)
{
    
    
    return a*(b/gcd(a,b));
}
 
template <class T>
void read(T &x)
{
    
    
    char c;
    bool op = 0;
    while(c = getchar(), c < '0' || c > '9')
        if(c == '-')
            op = 1;
    x = c - '0';
    while(c = getchar(), c >= '0' && c <= '9')
        x = x * 10 + c - '0';
    if(op)
        x = -x;
}
template <class T>
void write(T x)
{
    
    
    if(x < 0)
        x = -x, putchar('-');
    if(x >= 10)
         write(x / 10);
    putchar('0' + x % 10);
}
ll qsm(int a,int b,int p)
{
    
    
    ll res=1%p;
    while(b)
    {
    
    
        if(b&1)
            res=res*a%p;
        a=1ll*a*a%p;
        b>>=1;
    }
    return res;
}
struct node
{
    
    
    int to,nex,w;
}edge[N];
int head[N],dis[N],vis[N];
int tot,bcnt;
int n,m,s;
int w[N];
void add(int u,int v,int w)
{
    
    
    edge[tot].w=w;
    edge[tot].to=v;
    edge[tot].nex=head[u];
    head[u]=tot++;
}
void dijkstra()
{
    
    
    memset(dis,inf,sizeof dis);
    priority_queue<PII,vector<PII>,greater<PII> >heap;
    dis[1]=0;
    heap.push({
    
    dis[1],1});
    while(heap.size())
    {
    
    
        auto now=heap.top();
        heap.pop();
        int distance=now.first,u=now.second;
        if(vis[u])continue;
        vis[u]=1;
        for(int i=head[u];~i;i=edge[i].nex)
        {
    
    
            int v=edge[i].to,w=edge[i].w;
            if(dis[v]>dis[u]+w)
            {
    
    
                dis[v]=dis[u]+w;
                heap.push({
    
    dis[v],v});
            }
        }
    }

    if(dis[s+100]==inf)cout<<-1<<endl;
    else cout<<dis[s+100]<<endl;
    memset(vis,0,sizeof vis);


}




int main()
{
    
    
   while(cin>>n>>m>>s)
   {
    
    
       memset(head,-1,sizeof head);
       tot=0;
       while(m--)
       {
    
    
           int a,b,c;
           cin>>a>>b>>c;
           add(100+a,100+b,c);
       }

       int d;
       cin>>d;
       for(int i=0;i<d;i++)
       {
    
    
           int x;
           cin>>x;
           add(1,x+100,0);
       }
       dijkstra();

   }
   
   return 0;

}


猜你喜欢

转载自blog.csdn.net/qq_43619680/article/details/112920110