Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 3169 | Accepted: 1130 |
Description
Input
Output
Sample Input
1 6 2 1 2 10 2 3 10 3 4 10 4 5 10 5 6 10 6 1 10
Sample Output
5
题意:为了尽可能的减少居民离消防站的不满意度(所有居民离其最近的消防站距离最大值),现在决定让你选一个新的地址使得不满意度最小,,
思路:先对当前已经存在的消防站求最短路径,然后枚举没有建消防站的地址,求最短路,找出最小的那个即为新选的地址。。。
#include<vector> #include<iostream> #include<algorithm> #include<queue> #include<string.h> #include<string> #include<cstdio> #define inf 0xffffff #define M 505 using namespace std; int len[M],tmplen[M]; struct Gnode { Gnode() {} Gnode(int len,int num):len(len),num(num) {} int len,num; }; vector<int>fire; void SPFA(const vector<vector<Gnode> >&Graph,int start) { queue<int> Q; Q.push(start); len[start]=0; while(!Q.empty()) { int cur=Q.front();Q.pop(); for(int i=0;i<Graph[cur].size();++i) { if(len[cur]!=inf&&len[cur]+Graph[cur][i].len<len[Graph[cur][i].num]) { len[Graph[cur][i].num]=len[cur]+Graph[cur][i].len; Q.push(Graph[cur][i].num); } } } } int main() { int f,n; while(~scanf("%d%d",&f,&n)) { vector<vector<Gnode> >Graph(n); fire.clear(); bool visit[M]; memset(visit,false,sizeof(visit)); for(int i=0;i!=f;++i) { int a; scanf("%d",&a); fire.push_back(a-1); visit[a-1]=true; } getchar(); char str[100]; while(gets(str)&&strlen(str)) { int a,b,len; sscanf(str,"%d%d%d",&a,&b,&len); Graph[a-1].push_back(Gnode(len,b-1)); Graph[b-1].push_back(Gnode(len,a-1)); } for(int i=0;i<n;++i) len[i]=inf; for(int i=0;i<fire.size();++i) SPFA(Graph,fire[i]); copy(len,len+n,tmplen); int p,min=inf; for(int i=0;i!=n;++i) if(!visit[i]) { SPFA(Graph,i); int maxx=*max_element(len,len+n); if(maxx<min){p=i;min=maxx;} copy(tmplen,tmplen+n,len); } printf("%d\n",p+1); }return 0; }