新年好(Dijkstra+dfs/全排列)

news/2025/1/23 17:06:32/

1135. 新年好 - AcWing题库

思路: 1.先预处理出1,a,b,c,d,e到其他点的单源最短路,也就是进行6次Dijkstra

            2.计算以1为起点的这6个数的全排列,哪种排列方式所得距离最小,也可以使用dfs

1.Dijkstra+dfs


#define int long longusing namespace std;typedef pair<int,int> PII;constexpr int N =2e5+5;
int dist[6][N];
bool st[50005];
int n,m,h[N],w[N],ne[N],e[N],idx;
int rela[N];
int ans;void add(int a,int b,int c)
{e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}void Dijkstra(int s, int dist[])
{memset(dist, 0x3f, N*4);//int是4字节,所以大小就是4*Nmemset(st,0,sizeof st);dist[s]=0;priority_queue<PII,vector<PII>,greater<PII>> heap;heap.push({0,s});while(heap.size()){auto [c,t] = heap.top();heap.pop();if(st[t]) continue;st[t]=true;for(int i=h[t];~i;i=ne[i]){int j=e[i];if(dist[j]>c+w[i]){dist[j]=c+w[i];heap.push({dist[j],j});}}}
}int dfs(int u,int num,int dis) 
{if (num==6){return dis;}int ret=0x3f3f3f3f;for (int i=1;i<=5;i++){if (!st[i]){st[i] = 1;ret = min(ret,dfs(i,num+1,dis+dist[u][rela[i]]));st[i] = 0;}}return ret;
}void solve()
{cin>>n>>m;rela[0]=1;for(int i=1;i<=5;i++){cin>>rela[i];}memset(h,-1,sizeof h);while(m--){int a,b,c;cin>>a>>b>>c;add(a,b,c),add(b,a,c);}for(int i=0;i<=5;i++){Dijkstra(rela[i],dist[i]);}memset(st,false,sizeof st);cout<<dfs(0,1,0);
}int32_t main()
{int t;//cin>>t;t=1;while(t--) solve();
}

2.Dijkstra+全排列

#define int long longusing namespace std;typedef pair<int,int> PII;constexpr int N =2e5+5;
int dist[6][N];
bool st[50005];
int n,m,h[N],w[N],ne[N],e[N],idx;
int rela[N],order[6];
int ans;void add(int a,int b,int c)
{e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}void Dijkstra(int s, int dist[])
{memset(st,0,sizeof st);dist[s]=0;priority_queue<PII,vector<PII>,greater<PII>> heap;heap.push({0,s});while(heap.size()){auto [c,t] = heap.top();heap.pop();if(st[t]) continue;st[t]=true;for(int i=h[t];~i;i=ne[i]){int j=e[i];if(dist[j]>c+w[i]){dist[j]=c+w[i];heap.push({dist[j],j});}}}
}void solve()
{memset(dist,0x3f,sizeof dist);cin>>n>>m;order[0]=0;rela[0]=1;for(int i=1;i<=5;i++){order[i]=i;cin>>rela[i];}memset(h,-1,sizeof h);while(m--){int a,b,c;cin>>a>>b>>c;add(a,b,c),add(b,a,c);}for(int i=0;i<=5;i++){Dijkstra(rela[i],dist[i]);}memset(st,false,sizeof st);ans=0x3f3f3f3f;do{if(order[0]!=0) break;int sum=dist[0][rela[order[1]]];for(int i=1;i+1<=5;i++)sum+=dist[order[i]][rela[order[i+1]]];ans=min(ans,sum);}while(next_permutation(order,order+6));cout<<ans;
}int32_t main()
{int t;//cin>>t;t=1;while(t--) solve();
}


http://www.ppmy.cn/news/1565533.html

相关文章

django admin list_display显示外键字段处理办法

参考&#xff1a; https://www.ywcsb.vip/blog/101.html list_display展示外键内容 表结构关系 表一&#xff1a; class Person(models.Model):firstname models.CharField(maxlength50)surname models.CharField(maxlength50)表二 class Friends(models.Model):person1…

机器学习-交叉验证

交叉验证 (Cross-Validation) 是一种评估模型性能和选择模型参数的统计学方法&#xff0c;特别是在数据量有限的情况下。它比简单地将数据分成训练集和测试集更加可靠&#xff0c;因为它利用了所有的数据进行训练和测试。 什么是交叉验证&#xff1f; 交叉验证的基本思想是将…

Nginx HTTP 服务器基础配置

一、Nginx 初相识 在当今互联网的广阔世界里&#xff0c;Nginx作为一款高性能的HTTP和反向代理服务器&#xff0c;犹如一颗璀璨的明星&#xff0c;闪耀在Web服务器领域的天空中。它诞生于2004年&#xff0c;由俄罗斯的Igor Sysoev开发&#xff0c;最初的目的是为了解决C10K问题…

GCC支持Objective C的故事?Objective-C?GCC只能编译C语言吗?Objective-C 1.0和2.0有什么区别?

GCC支持Objective C的故事 Objective-C 主要由 Stepstone 公司的Brad Cox和 Tom Love 在1980 年左右发明。乔布斯离开苹果公司后成立了NeXT STEP公司&#xff0c; 买下了Objective-C 语言的授权。GCC对Objective-C语言的支持是在1992年加入的&#xff0c;具体是在GCC 1.3版本中…

开发常用工具

在项目开发中&#xff0c;工具的使用起到了至关重要的作用&#xff0c;正所谓工欲善其事&#xff0c;必先利其器&#xff0c;掌握一些实用的开发工具能够使我们的开发效率事半功倍。 那么我们应该掌握哪些开发工具的使用方法呢&#xff1f;其实一路走来&#xff0c;我们已经介…

@RequestParam、@PathVariable、@PathParam有什么区别?

RequestParam、PathParam、PathVariable都是用于从HTTP请求中提取参数的注解&#xff0c;但它们有不同的使用场景和语法。 RequestParam用于从请求URL中“?”后面的部分或请求体中提取参数&#xff0c;并将这些参数绑定到方法的参数上。它通常用于处理GET和POST请求中的查询参…

Redis:解锁集群共享Session的秘密武器

一、分布式集群中 Session 共享的困境 在当今互联网技术蓬勃发展的时代&#xff0c;分布式系统和集群架构已成为构建大规模、高并发应用的关键技术手段。然而&#xff0c;在享受这些技术带来的强大性能和扩展性的同时&#xff0c;我们也面临着一系列挑战&#xff0c;其中 Sessi…

报错:{‘csrf_token‘: [‘The CSRF token is missing.‘]}

flask实现一个简单的注册界面报错 register.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <form action"" method"post&…