Buy a Ticket
Posted anyixing-fly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Buy a Ticket相关的知识,希望对你有一定的参考价值。
分析
暴力做法是从每个点开始跑最短路,显然会T。
进一步优化的话是将边权乘2,这样就不用跑回来了。
但是还是不行,那么有没有办法可以跑一次最短路就解决了呢。
开一个超级源点就行了。
这样从这个点开始跑,一次Dij后得到的就是答案。
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int lqs=1e6+10;
struct Edge{
int to,nxt;
ll val;
}e[lqs];
struct Node{
int id;ll val;
Node(){}
Node(int a,ll b){
id=a;val=b;
}
bool operator <(const Node &A)const{
return val>A.val;
}
};
int h[lqs],idx;
void Ins(int a,int b,ll c){
e[++idx].to=b;e[idx].nxt=h[a];
h[a]=idx;e[idx].val=c;
}
ll dis[lqs];
bool vis[lqs];
void dij(){
priority_queue<Node> q;
q.push(Node(0,0));
memset(dis,0x3f,sizeof(dis));
dis[0]=0;
while(!q.empty()){
Node u=q.top();q.pop();
if(vis[u.id])continue;
vis[u.id]=1;
for(int i=h[u.id];i;i=e[i].nxt){
int v=e[i].to;
if(dis[v]>dis[u.id]+e[i].val){
dis[v]=dis[u.id]+e[i].val;
q.push(Node(v,dis[v]));
}
}
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int a,b;ll c;
scanf("%d%d%lld",&a,&b,&c);
Ins(a,b,c<<1);Ins(b,a,c<<1);
}
for(int i=1;i<=n;i++){
ll w;
scanf("%lld",&w);
Ins(0,i,w);
}
dij();
for(int i=1;i<=n;i++)
printf("%lld ",dis[i]);
}
以上是关于Buy a Ticket的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 938 D. Buy a Ticket