// you can also use includes, for example:
// #include <algorithm>
#include <vector>
#include <iostream>
#include <cstdio>
#include "limits.h"
using namespace std;
void Dijster(vector<vector<int> >&graph, vector<int>&dis)
{
dis[0] = 0;
int N = dis.size();
vector<int> mark(N, -1);
mark[0] = 0;
int i, j;
for(i=1; i<N; ++i)
dis[i] = graph[0][i];
int k, min;
for(j=1; j<N; ++j)
{
min = INT_MAX; k=-1;
for(i=1; i<N; ++i)
{
if(mark[i] == -1 && dis[i] >-1 && min>dis[i])
{
min = dis[i];
k=i;
}
}
if(k==-1) break;
mark[k] = 0;
for(i=1; i<N; ++i)
{
if(mark[i]==-1&& graph[k][i]>-1 && (dis[i]==-1 || dis[i] > dis[k]+graph[k][i] || dis[i]==-1))
{
dis[i] = dis[k] + graph[k][i];
}
}
}
}
int solution(const vector<int> &A, const vector<int> &B, const vector<int> &C, const vector<int> &D) {
// write your code in C++98
int M = A.size();
int N = D.size();
if(D[0] >=0) return 0;
vector<vector<int> >graph(N, vector<int>(N, -1));
int i, j;
for(i=0; i<M; ++i)
{
int x = A[i];
int y = B[i];
int z = C[i];
if(graph[x][y]==-1)
{
graph[x][y] = z;
graph[y][x] = z;
}
else if(graph[x][y] > z)
{
graph[x][y] = graph[y][x] = z;
}
}
vector<int> dis(N, -1);
Dijster(graph, dis);
int min = INT_MAX;
for(i=1; i<N; ++i)
{
if(dis[i]>-1 && dis[i] <= D[i])
{
if(min == INT_MAX || min>dis[i])
min = dis[i];
}
}
if(min != INT_MAX) return min;
return -1;
}
Codility -- grocery_store
最新推荐文章于 2021-02-16 22:41:43 发布