日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

CSP 201903-5 317号子任务 暴力30分+优化100分

發(fā)布時(shí)間:2023/12/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSP 201903-5 317号子任务 暴力30分+优化100分 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原題鏈接CSP 201903-5 317號(hào)子任務(wù)

1.下面是30分的暴力代碼,僅僅使用常規(guī)的未優(yōu)化的Dijkstra算法做的

#include <bits/stdc++.h> using namespace std; #define ll long long const int MAX=10010; const int INF=1e8;int n,m,k; int f[MAX]; struct node {int v,w;node(int _v,int _w){v=_v;w=_w;} }; vector<int> x[MAX]; vector<node> g[MAX]; int d[MAX]; int vis[MAX]; void dijk(int s) {fill(d,d+MAX,INF);memset(vis,0,sizeof(vis));d[s]=0;for(int i=1;i<=n;i++){int u=-1;int MIN=INF;for(int j=1;j<=n;j++){if(vis[j]==0 && d[j]<MIN){u=j;MIN=d[j];}}if(u==-1)return ;vis[u]=1;for(int j=0;j<g[u].size();j++){int v=g[u][j].v;if(vis[v]==0 && d[u]+g[u][j].w<d[v]){d[v]=d[u]+g[u][j].w;}}} } int main() {std::ios::sync_with_stdio(false);cin>>n>>m>>k;for(int i=1;i<=n;i++){cin>>f[i];}while(m--){int u,v,w;cin>>u>>v>>w;g[u].push_back(node(v,w));g[v].push_back(node(u,w));}for(int i=1;i<=n;i++){dijk(i);ll sum=INF;for(int j=1;j<=n;j++){if(f[j]==1 && d[j]!=INF)x[i].push_back(d[j]);}sort(x[i].begin(),x[i].end());ll tmp=0;if(x[i].size()>=k){for(int j=0;j<k;j++){tmp+=x[i][j];}}else{for(int j=0;j<x[i].size();j++){tmp+=x[i][j];}}sum=min(sum,tmp);cout<<sum<<endl;}return 0; }


2.下面是100分的優(yōu)化代碼,使用優(yōu)化過(guò)的優(yōu)先隊(duì)列+Dijkstra算法做的,有一點(diǎn)需要注意,做題的時(shí)候需要把握數(shù)據(jù)范圍的“魅力”,由上圖可知,對(duì)于60%的數(shù)據(jù),保證行星發(fā)動(dòng)機(jī)的數(shù)量與k相同,這點(diǎn)很重要,我開(kāi)始僅僅只優(yōu)化過(guò)了“優(yōu)先隊(duì)列+Dijkstra算法”,后面對(duì)每一個(gè)點(diǎn)計(jì)算他與K個(gè)行星發(fā)動(dòng)機(jī)的最短距離,交上去還是30分,于是我把后面的計(jì)算距離“由遍歷所有節(jié)點(diǎn)到行星發(fā)動(dòng)機(jī)的距離改為遍歷行星發(fā)動(dòng)機(jī)結(jié)點(diǎn)到每個(gè)結(jié)點(diǎn)的距離”,即for循環(huán)里的遍歷由1e4變?yōu)榱?e2,極大的減少了計(jì)算過(guò)程,不過(guò)我這樣的想法本來(lái)是只想著通過(guò)60%的數(shù)據(jù),沒(méi)想到100分了

以下是滿分代碼

#include <bits/stdc++.h> using namespace std; const int N=1e4+10; const int INF=0x3f3f3f3f; #define ll long longint n,m,k; struct Node {int v;int w;Node(int _v,int _w){v=_v; w=_w;}friend bool operator < (const Node& a,const Node& b){return a.w>b.w;} }; int type[N]; vector<Node> adj[N]; vector<int> dis[N];ll d[N]; bool vis[N]; priority_queue<Node> q;void dijkstra(int s) {fill(d,d+N,INF);memset(vis,0,sizeof(vis));d[s]=0;q.push(Node(s,d[s]));while(!q.empty()){Node x=q.top();q.pop();int u=x.v;if(vis[u]==1) continue;vis[u]=1;for(int i=0;i<adj[u].size();i++){int v=adj[u][i].v;if(vis[v]==0 && d[u]+adj[u][i].w<d[v]){d[v]=d[u]+adj[u][i].w;q.push(Node(v,d[v]));}}} }int main() {std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m>>k;for(int i=1;i<=n;i++) cin>>type[i];for(int i=0;i<m;i++){int u,v,w;cin>>u>>v>>w;adj[u].push_back(Node(v,w));adj[v].push_back(Node(u,w));}for(int i=1;i<=n;i++){if(type[i]){dijkstra(i);for(int j=1;j<=n;j++){if(d[j]!=INF) dis[j].push_back(d[j]);}}}for(int i=1;i<=n;i++){sort(dis[i].begin(),dis[i].end());ll res=INF,tmp=0;if(dis[i].size()<=k){tmp=accumulate(dis[i].begin(),dis[i].end(),0);}else tmp=accumulate(dis[i].begin(),dis[i].begin()+k,0);cout<<min(res,tmp)<<endl;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的CSP 201903-5 317号子任务 暴力30分+优化100分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。