★ 输入文件:djsa.in
输出文件:djsa.out
简单对比
时间限制:1 s
内存限制:128 MB
问题描述
为了进一步普及九年义务教育,政府要在某乡镇建立一所希望小学,该乡镇共有n个村庄,村庄间的距离已知,请问学校建在哪个村庄最好?(好坏的标准是学生就近入学,即在来上学的学生中,以最远的学生走的路程为标准。或者说最远的学生与学校的距离尽可能的小。)
为了进一步普及九年义务教育,政府要在某乡镇建立一所希望小学,该乡镇共有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
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 }