对于本题的黄题做法
查看原帖
对于本题的黄题做法
1268524
DX3906_ourstar楼主2024/11/20 13:34

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');
}
2024/11/20 13:34
加载中...