[最短路] 2017 计蒜之道 复赛 D. 百度地图导航

直接最短路就好了
第一次写竟然只拆了一个点 样例输出一坨0 QAQ
没有拿到FB 不开心

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#define cl(x) memset(x,0,sizeof(x))
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<ll,int> abcd;

inline char nc(){
  static char buf[100000],*p1=buf,*p2=buf;
  return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void read(int &x){
  char c=nc(),b=1;
  for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
  for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
const int N=200005;
const int M=400005;
struct edge{
  int u,v,w,next;
}G[M<<1];
int head[N],inum;
#define V G[p].v
inline void add(int u,int v,int w){
  int p=++inum; G[p].u=u; G[p].v=v; G[p].w=w; G[p].next=head[u]; head[u]=p;
}
inline void link(int u,int v,int w){
  add(u,v,w); add(v,u,w);
}
inline void clear(){
  cl(head); inum=0;
}
int n,m;
int S,T;
ll dis[N];
priority_queue<abcd> Q;
inline void Dij(){
  while (!Q.empty()) Q.pop();
  for (int i=1;i<=n+m+m;i++) dis[i]=1LL<<60;

  dis[S]=0,Q.push(abcd(0,S));

  while (!Q.empty()){
    int u=Q.top().second; ll d=Q.top().first; Q.pop();
    if (dis[u]!=-d) continue;
    for (int p=head[u];p;p=G[p].next)
      if (dis[V]>dis[u]+G[p].w){
    dis[V]=dis[u]+G[p].w;
    Q.push(abcd(-dis[V],V));
      }
  }
}
int main(){
  int k,x,y,w;
  freopen("t.in","r",stdin);
  freopen("t.out","w",stdout);
  read(n); read(m);
  for (int i=1;i<=m;i++){
    read(k);
    while (k--){
      read(x),add(x,n+i,0),add(n+m+i,x,0);
    }
  }
  int mm;
  read(mm);
  while (mm--){
    read(x); read(y); read(w);
    add(x,y,w); add(y,x,w);
  }
  read(mm);
  while (mm--){
    read(x); read(y); read(w);
    add(n+x,n+m+y,w);
    add(n+y,n+m+x,w);
  }
  read(S); read(T);
  Dij();
  if (dis[T]==1LL<<60)
    printf("-1\n");
  else
    printf("%lld\n",dis[T]);
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值