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\n",r); } } return 0; }

猜你喜欢

转载自www.cnblogs.com/shiliuxinya/p/12178139.html
今日推荐