求出所有FireStation到其它的Intersection的距离,再求出基它Intersection到其它点的距离,然后比较距离就OK了
用SPFA +AdjacencyList 的速度较快 用Dijkstra会超时
题目测试数据:http://plg1.cs.uwaterloo.ca/~acm00/990925.data/
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAXN 510 struct node { int v; int w; node* next; }; inline void AdjacencyList(int u,int v,int w,node edge[]) { node* NewNode = new node; NewNode -> v = v; NewNode -> w = w; NewNode -> next = edge[u].next; edge[u].next = NewNode; } int qu[MAXN * 4]; void spfa(int start,int d[],node edge[]) { bool visit[MAXN]; memset(visit,false,sizeof(visit)); qu[0] = start; d[start] = 0; visit[start] = true; int head = 0; int tail = 1; while(head < tail)//queue.empty { /* cout<<"qu"<<endl; for(int i = head; i < tail; i++) { cout<<qu[i]<<" "; }*/ // cout<<endl; int u = qu[head++]; visit[u] = false;//不在队列 node* ptr = edge[u].next; while(ptr) { if(d[ptr -> v] > d[u] + ptr -> w) { d[ptr -> v] = d[u] + ptr -> w; if(visit[ptr -> v] == false) { qu[tail++] = ptr -> v;//成功松驰加入队列 visit[ptr -> v] = true;//在队列里面 } } ptr = ptr -> next; } } /*cout<<"d"<<endl; for(int i = 1; i <= SumInter; i++) { cout<<d[i]<<" "; } cout<<endl;*/ } int main() { int SumFire,SumInter; int fire[MAXN]; //freopen("A.3.dat","r",stdin); while(scanf("%d %d",&SumFire,&SumInter) != EOF) { int i; int d[MAXN]; memset(d,127,sizeof(d)); node edge[MAXN]; for(i = 0; i <= SumInter; i++) { edge[i].next = NULL; } for(i = 0; i < SumFire; i++) { scanf("%d",&fire[i]); } int from,to,w; while(scanf("%d %d %d",&from,&to,&w) != EOF) { AdjacencyList(from,to,w,edge); AdjacencyList(to,from,w,edge); } for(i = 0; i < SumFire; i++) { spfa(fire[i],d,edge); } int dis[MAXN]; int ans; memset(&ans,127,sizeof(ans)); int flag; flag = 1; for(i = 1; i <= SumInter; i++) { if(d[i] == 0) { continue; } memcpy(dis,d,sizeof(dis)); spfa(i,dis,edge); int MaxEdge = 0; int j; for(j = 1; j <= SumInter; j++) { if(dis[j] > MaxEdge) { MaxEdge = dis[j]; //cout<<"MaxEdge"<<MaxEdge<<endl; } } if(MaxEdge < ans) { ans = MaxEdge; flag = i; } } printf("%d\n",flag); } return 0; }