COGS 服务点设置 DB

★   输入文件:djsa.in   输出文件:djsa.out   简单对比
时间限制:1 s   内存限制:128 MB

问题描述
为了进一步普及九年义务教育,政府要在某乡镇建立一所希望小学,该乡镇共有n个村庄,村庄间的距离已知,请问学校建在哪个村庄最好?(好坏的标准是学生就近入学,即在来上学的学生中,以最远的学生走的路程为标准。或者说最远的学生与学校的距离尽可能的小。)
【输入格式】
输入由若干行组成,第一行有两个整数,n(1≤n≤100)、m(1≤m≤n*n);n表示村庄数,m表示村庄间道路数。第2至m+1行是每条路的信息,每行三个整数,为道路的起点、终点和两村庄间距离。(村庄从0开始编号)
【输出格式】
一个整数,学校所在村庄编号(如果两个村庄都适合建立学校,选择编号小的村庄建学校)。
【输入样例】
输入文件名:djsa.in
6 8
0 2 10
0 4 30
0 5 100
1 2 5
2 3 50
3 5 10
4 3 20
4 5 60
【输出样例】
输出文件名:djsa.out
4
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<queue>
  5 
  6 using namespace std;
  7 const int N=101;
  8 const int maxn=999999;
  9 
 10 int head[N];
 11 int now=1;
 12 int vis[N];
 13 int dis[N];
 14 queue<int>q;
 15 int n,m;
 16 int js;
 17 
 18 struct node{
 19     int u,v,w,nxt;
 20 }E[N*N];
 21 
 22 struct Node{
 23     int me,answer;
 24 }Ans[N];
 25 
 26 inline void read(int &x)
 27 {
 28     char c=getchar();
 29     x=0;
 30     while(c<'0'||c>'9')c=getchar();
 31     while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
 32 }
 33 
 34 inline void add(int u,int v,int w)
 35 {
 36     E[now].u=u;
 37     E[now].v=v;
 38     E[now].w=w;
 39     E[now].nxt=head[u];
 40     head[u]=now++;
 41 }
 42 
 43 inline int spfa(int s)
 44 {
 45     for(int i=0;i<n;i++)
 46         dis[i]=maxn,vis[i]=0;
 47     while(q.size())q.pop();
 48     dis[s]=0;
 49     vis[s]=1;
 50     q.push(s);
 51     while(!q.empty())
 52     {
 53         int top=q.front();
 54         q.pop();
 55         for(int i=head[top];i!=-1;i=E[i].nxt)
 56         {
 57             int v=E[i].v;
 58             int w=E[i].w;
 59             if(dis[top]+w<dis[v])
 60             {
 61                 dis[v]=dis[top]+w;
 62                 if(!vis[v])
 63                     q.push(v);
 64             }
 65         }
 66     }
 67     int answer=-1;
 68     for(int i=1;i<=n;i++)
 69         if(i!=s)
 70             answer=max(answer,dis[i]);
 71     return answer;
 72     
 73 }
 74 
 75 inline bool cmp(Node a,Node b)
 76 {
 77     if(a.answer==b.answer)
 78         return a.me<b.me;
 79     else return a.answer<b.answer;
 80 }
 81 
 82 int main()
 83 {
 84     freopen("djsa.in","r",stdin);
 85     freopen("djsa.out","w",stdout);
 86     read(n);
 87     read(m);
 88     for(int i=0;i<n;i++)
 89        head[i]=-1;
 90     
 91     for(int i=1;i<=m;i++)
 92     {
 93         int u,v,w;
 94         read(u);
 95         read(v);
 96         read(w);
 97         add(u,v,w);
 98         add(v,u,w);
 99     }
100     
101     for(int i=0;i<n;i++)
102     {
103         Ans[i].me=i;
104         Ans[i].answer=spfa(i);
105     }
106     sort(Ans,Ans+n,cmp);
107     printf("%d",Ans[0].me);
108     
109     return 0;
110 }
原文地址:https://www.cnblogs.com/lyqlyq/p/6858129.html