题目大意:
给定一张$k$个结点,$m$条边的无向图,其中有$n$个点被标记,在这$k$个点中找出一个点使得这个点到那$n$个点的最短距离之和最小,求出这个距离和。思路:
对于每个标记结点跑最短路,最后枚举每个结点,求出其到各个标记结点的最短距离和,取$min$。1 #include2 #include 3 #include 4 #include 5 inline int getint() { 6 char ch; 7 while(!isdigit(ch=getchar())); 8 int x=ch^'0'; 9 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');10 return x;11 }12 const int inf=0x7fffffff;13 const int V=801;14 struct Edge {15 int to,w;16 };17 std::vector e[V];18 inline void add_edge(const int u,const int v,const int w) {19 e[u].push_back((Edge){v,w});20 }21 struct Vertex {22 int id,dis;23 bool operator > (const Vertex &another) const {24 return dis>another.dis;25 }26 };27 int k;28 int dis[V][V];29 __gnu_pbds::priority_queue > q;30 __gnu_pbds::priority_queue >::point_iterator p[V];31 inline void Dijkstra(const int s,int *dis) {32 q.clear();33 for(int i=1;i<=k;i++) {34 p[i]=q.push((Vertex){i,dis[i]=(i==s)?0:inf});35 }36 while(q.top().dis!=inf) {37 int x=q.top().id;38 for(unsigned i=0;i