公路通行税(Ceoi99)

版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址!

在PALMIA国家内,有N个城市由公路相连(每条公路恰好双向连接两个城市)。经由一条公路或多条公路,从任一城市出发可以到达其余各个城市。直到今年,公路上才要征收公路通行税。在每条公路的中间,有一征税员,从每一辆经由此路的车收取 1 PALMIA COIN(1PC)。

政府官员决定减少收税员而推行公路印花。如果一辆车欲进入一条公路,就必须将这张印花贴在窗上。

政府官员决定:一年的公路印花的价值相当于在两个最远城市之间进行100次旅行所需的费用。两个城市之间的距离是从一个城市到达第二个城市所需经过的最少数目的公路数。

你的任务是编写一个程序计算出公路印花的价值。

输入数据:

输入文件中包含几组数据。每组的第一行包括整数N和M(中间被一个空格隔开),N是该国家中城市的数目,M是公路的数目(1≦N≦1000,1≦M≦2000)。城市由整数进行编号,从1到N。接下来的M行,每行均包含一对整数A,B(1≦A,B≦N),中间由一空格隔开,代表在城市A与B之间有一条公路。在最后一组数后仅有一行,是两个0,中间被一空格隔开。

输出数据:

对输入文件中的各组数据,输出文件中包含一行,表示公路印花的价值。

输入输出示例:

TOLLS.IN:

4 4

1 2

2 3

4 2

3 4

0 0

TOLLS.OUT:

200

解题报告

简单来说就是寻找图的直径,因为数据n<=1000,对于每个点用最短路为O(n*nlogn)是过不了的,但注意到路径长度只有1,所以我们可以用BFS,时间勉勉强前过去。不过,我们可以先对某个点用单源最短路。然后记录距离其最远的点,再依次对他们用BFS,这样效率会快很多而且答案也是正确的。

#include<bits/stdc++.h>
#define MAXN 1000+1
#define MAXM 500000+1
#define Pair pair<int,int>
using namespace std;
int n,m,t,v[MAXN],num;
int head[MAXN],g[MAXN][MAXN];
queue<Pair> emp;
struct Edge{
int dis;
int to,next;
}edge[MAXM];
int read()
{
int in=;
char ch=getchar();
for(;ch>''||ch<'';ch=getchar());
for(;ch>=''&&ch<='';ch=getchar()) in=in*+ch-'';
return in;
}
void add(int from,int to,int dis)
{
edge[++num].next=head[from];
edge[num].to=to;
edge[num].dis=dis;
head[from]=num;
}
void bfs(int s,int &maxl)
{
memset(v,,sizeof(v));
queue<Pair> h=emp;
h.push(Pair(,s));
while(h.size()>)
{
int k=h.front().second,diss=h.front().first;h.pop();v[k]=;
for(int i=head[k];i;i=edge[i].next)
if (v[edge[i].to]==)
{
v[edge[i].to]=;
g[edge[i].to][k]=g[k][edge[i].to]=diss+;
h.push(Pair(diss+,edge[i].to));
maxl=max(maxl,diss+);
}
}
}
void dij(int s)
{
memset(v,,sizeof(v));
priority_queue<Pair,vector<Pair>,greater<Pair> > h;
int dis[MAXN],maxx=;for(int i=;i<=n;i++) dis[i]=;
dis[s]=;
h.push(Pair(dis[s],s));
while(h.size()>)
{
int k=h.top().second;h.pop();
if(v[k]) continue;
v[k]=;
for(int i=head[k];i;i=edge[i].next)
{
if(dis[k]+edge[i].dis<dis[edge[i].to])
{
dis[edge[i].to]=dis[k]+edge[i].dis;
h.push(Pair(dis[edge[i].to],edge[i].to));
}
}
}
queue<int> q;
for(int i=;i<=n;i++)
if(dis[i]!=) maxx=max(maxx,dis[i]);
for(int i=;i<=n;i++) if(dis[i]==maxx) q.push(i);
if(maxx!=)
while(q.size()>)
{
bfs(q.front(),maxx);q.pop();
}
else
{
for(int i=;i<=n;i++)
{
bfs(i,maxx);
}
}
printf("%d\n",maxx*);
}
int main()
{ while(scanf("%d%d",&n,&m)==)
{
int maxl=;
if(m==&&n==) return ;
memset(edge,,sizeof(edge));
memset(g,,sizeof(g));
num=;//memset(dis,0,sizeof(dis));
memset(head,,sizeof(head));
for(int i=;i<=m;i++)
{
int a,b;a=read();b=read();
add(a,b,);
add(b,a,);
}
dij(); }
return ;
}

最新文章

  1. JavaScript 字符串处理详解
  2. 承接Hololens游戏外包
  3. Android如何使用NoHttp
  4. 数组拷贝 copyOf()
  5. AS问题解决系列1—Unable to execute DX错误
  6. c++学习笔记和思考
  7. POJ 2400 最小权匹配
  8. smarty函数-转载
  9. POJ2195 Going Home 【最小费用流】+【最佳匹配图二部】
  10. html5客户端本地存储之sessionStorage及storage事件
  11. 微信小程序与Java后台通信
  12. 【SQL进阶】03.执行计划之旅1 - 初探
  13. AngularJS获取项目中定义的json文件
  14. jquery mobile开发中页面跳转后js不执行的问题
  15. Django商城项目笔记No.5用户部分-注册接口-短信验证码
  16. HTML 样式 (style) 实例
  17. 【架构】MVC模式
  18. 尚硅谷JavaSEday18 String类练习题
  19. Spring框架的补充
  20. Android IntentService

热门文章

  1. jQuery学习(八)——使用JQ插件validation进行表单校验
  2. Android群英传-拼图游戏puzzle-6点吐槽
  3. 【codeforces 496E】Distributing Parts
  4. CI框架源代码阅读笔记2 一切的入口 index.php
  5. iOS CST NSDate
  6. 日期格式,Popup的使用方法,RenderTransform与LayoutTransform的区别
  7. 如何在github的README.md中添加图片
  8. 46. AngularJS所有版本下载
  9. django 笔记14 中间件
  10. jzoj3454 表白(love)解题报告(01分数规划+DP)