rt,有更优解吗
63ms:
//dijkstra单源点最短路
#include<iostream>
#include<cstring>
#include<queue>
#define INF 0x7fffffff
using namespace std;
const int N=1e6+5;
int cnt,a,b;
int head[N],dis[N];
bool vis[N];
struct edge{
int v,w,next;
}e[N];
inline void add(int u,int v,int w){
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
return ;
}
inline void dijkstra(int s){
typedef pair<int,int> p;
priority_queue<p,vector<p>,greater<p> > q;
dis[s]=0;
q.push(make_pair(dis[s],s));
vis[s]=true;
while(!q.empty()){
int u=q.top().second;
q.pop();
vis[u]=false;
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
if(!vis[v]){
vis[v]=true;
q.push(make_pair(dis[v],v));
}
}
}
}
return ;
}
signed main(){
memset(head,-1,sizeof(head));
for(int i=1;i<N;i++)dis[i]=INF;
cin>>a>>b;
add(1,2,a);
add(2,3,b);
dijkstra(1);
cout<<dis[3]<<"\n";
return 0;
}
66ms:
//SPFA单源点最短路
#include<iostream>
#include<cstring>
#include<queue>
#define re register
#define INF 0x7fffffff
using namespace std;
const int N = 1e6 + 5;
queue<int> q;
bool vis[N];
int head[N],dis[N];
int cnt,a,b;
struct edge{
int v,w,next;
}e[N];
inline void add(int u,int v,int w){
e[++ cnt].w=w;
e[cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt;
}
inline void SPFA(int s){
dis[s]=0;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=false;
for(int i= head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
if(!vis[v]){
q.push(v);
vis[v] = true;
}
}
}
}
return ;
}
inline void cs(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
memset(head,-1,sizeof(head));
for(re int i = 0;i < N;i ++)dis[i] = INF;
}
int main(){
cs();
cin>>a>>b;
add(1,2,a);
add(2,3,b);
SPFA(1);
cout<<dis[3]<<"\n";
return 0;
}
59ms:
//最小生成树
#include<iostream>
#include<algorithm>
#define re register
#define int long long
using namespace std;
const int N = 1e6 + 5;
int a,b,cnt,ans;
int fa[N];
struct edge{
int u,v,w;
}e[N];
inline int find(int x){
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
inline bool cmp(edge a,edge b){
return a.w < b.w;
}
inline void add(int u,int v,int w){
cnt ++;
e[cnt].u = u;
e[cnt].v = v;
e[cnt].w = w;
return ;
}
inline void cs(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
for(re int i = 1;i <= N;i ++){
fa[i] = i;
}
return ;
}
signed main(){
cs();
cin>>a>>b;
add(1,2,a);
add(2,3,b);
sort(e + 1,e + 3,cmp);
ans = 0;
for(re int i = 1;i <= 3;i ++){
int x = find(e[i].u);
int y = find(e[i].v);
if(x != y){
ans += e[i].w;
fa[x] = y;
}
}
cout<<ans<<"\n";
return 0;
}
40ms:
//线段树
#include<cstdio>
namespace OIfast{
#define re register
using namespace std;inline int read(){re int n=0,f=1;re char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')n=n*10+c-'0',c=getchar();return n*f;}inline void print(re int n){if(n<0)putchar('-'),n=-n;if(n>=10)print(n/10);putchar(n%10+'0');return ;}inline void write(re int n,re char c){print(n),putchar(c);return;}};using namespace OIfast;
const int N=1e6+5;
int a[N];
struct node{
int l,r,sum;
}tree[N];
inline void build(int now,int l,int r){
int ls=now*2,rs=now*2+1,mid=(l+r)/2;
tree[now].l=l,tree[now].r=r;
if(l==r){
tree[now].sum=a[l];
return ;
}
build(ls,l,mid);
build(rs,mid+1,r);
tree[now].sum=tree[ls].sum+tree[rs].sum;
}
inline int query(int now,int l,int r){
int s=0,ls=now*2,rs=now*2+1;
if(tree[now].l>=l&&tree[now].r<=r)return tree[now].sum;
if(tree[now].r<l||tree[now].l>r)return 0;
if(tree[ls].r>=l)s+=query(ls,l,r);
if(tree[ls].l<=r)s+=query(rs,l,r);
}
signed main(){
a[1]=read(),a[2]=read();
build(1,1,2);
write(query(1,1,2),'\n');
}