ccf 201903-5
Posted shiliuxinya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ccf 201903-5相关的知识,希望对你有一定的参考价值。
未优化的迪杰斯特拉:30分的代码
#include <stdio.h> #include <iostream> #include <queue> #include <string.h> #include <algorithm> #define MAX 10000 #define INF 99999999 using namespace std; int flag[MAX]; int d[MAX]; int all[MAX][MAX]; bool vis[MAX]; int dis[MAX]; int map[MAX][MAX]; int dist[MAX]; void dijkstra(int s, int count, int n){ memset(dis,INF,sizeof(dis)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) dis[i]=map[s][i]; dis[s]=0; int min,k; for(int i=1;i<=n;i++){ min=INF; for(int j=1;j<=n;j++){ if(dis[j]<min && !vis[j]){ min=dis[j]; k=j; } } vis[k]=1; for(int p=1;p<=n;p++){ if(!vis[p]){ if(dis[p] > dis[k]+map[k][p]) dis[p] = dis[k]+map[k][p]; } } } } for(int i=1;i<=n;i++) all[count][i]=dis[i];
} int main(){ int n,m,k; int u,v,w; int count; int c,r; while(scanf("%d %d %d",&n,&m,&k)!=EOF){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) map[i][j]=INF; memset(flag,0,sizeof(flag)); count=0; for(int i=1;i<=n;i++){ cin >> flag[i]; if(flag[i]) count++; } for(int i=1;i<=m;i++){ scanf("%d %d %d",&u,&v,&w); if(map[u][v] > w) map[u][v] = map[v][u] = w; } c=0; for(int i=1;i<=n;i++){ if(flag[i]){ //求行星据点到每个顶点的距离,不必求任意两点之间的距离 dijkstra(i, c, n); c++; } } for(int i=1;i<=n;i++){ //求n个顶点 memset(d,0,sizeof(d)); for(int j=0;j<count;j++) //count个行星据点,count行 d[j] = all[j][i]; //顶点i到行星据点的距离等于对应的列的值 sort(d,d+count); r=0; for(int p=0;p<k; p++) if(d[p]!=INF) r+=d[p]; printf("%d ",r); } } return 0; }
以上是关于ccf 201903-5的主要内容,如果未能解决你的问题,请参考以下文章