Fire Station //SPFA.. //ZOJ上,0MS,192K.现在第3..POJ上64MS,15名 //NYOJ上的数据量是ZOJ上的20倍。。认为自己程序写得好的可以去提交试试 /NYOJ210 #include<iostream> #include<vector> #include<cstdio> #include<iterator> #include<queue> #include<cstring> #include<algorithm> using namespace std; vector<short> fire; const short MAX=500; int INF=0x7fff; struct GNode { GNode(){} GNode(short num,short len):len(len),num(num){} short len,num; }; short len[MAX],tmplen[MAX]; void SPFA(const vector<vector<GNode> >& Graph,int From) { queue<int> Q; Q.push(From); len[From]=0; while(!Q.empty()) { int top=Q.front();Q.pop(); for(unsigned i=0;i!=Graph[top].size();i++) { if(len[top]!=INF && len[top]+Graph[top][i].len<len[Graph[top][i].num]) { len[Graph[top][i].num]=len[top]+Graph[top][i].len; Q.push(Graph[top][i].num); } } } } int main() { int f,n,d,a,b; char str[100]; while(~scanf("%d%d",&f,&n)) { vector<vector<GNode> > Graph(n); //CLR(Graph,0); fire.clear(); for(int i=0;i!=f;i++) {scanf("%d",&d);fire.push_back(d-1);} getchar(); while(gets(str)&& strlen(str)){sscanf(str,"%d%d%d",&a,&b,&d);Graph[a-1].push_back(GNode(b-1,d));Graph[b-1].push_back(GNode(a-1,d));} for(unsigned i=0;i!=Graph.size();i++) {len[i]=INF;} for(int i=0;i!=f;i++) SPFA(Graph,fire[i]); copy(len,len+n,tmplen); int MinD=INF,MinI,maxelem; for(int i=0;i!=n;i++) { SPFA(Graph,i); maxelem=*max_element(len,len+n); if(MinD>maxelem) {MinD=maxelem;MinI=i;} copy(tmplen,tmplen+n,len); } cout<<MinI+1<<endl; } }