第二次考试 (图论)第四题 货车运输
2016-07-14 17:16
316 查看
重庆一中高2018级信息学竞赛试题
4、货车运输
(bus.cpp/c/pas)
【问题描述】
A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限
制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最
多能运多重的货物。
【输入格式】
第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道路。
接下来 m 行每行 3 个整数 x、y、z,每两个整数之间用一个空格隔开,表示从 x 号城市到
y 号城市有一条限重为 z 的道路。注意:x 不等于 y,两座城市之间可能有多条道路。
接下来一行有一个整数 q,表示有 q 辆货车需要运货。
接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市运输
货物到 y 城市,注意:x 不等于 y。
【输出格式】
输出共有 q 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货车不能到
达目的地,输出-1。
【输入输出样例】
bus.in bus.out
4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
3
-1
3
【数据范围】
对于 30%的数据,0 < n < 1,000,0 < m < 10,000,0 < q < 1,000;
对于 60%的数据,0 < n < 1,000,0 < m < 50,000,0 < q < 1,000;
对于 100%的数据, 0 < n < 10,000, 0 < m < 50,000, 0 < q < 30,000, 0 ≤ z ≤ 100,000。
方法同邦德市,简直一模一样。
交上去从第一个开始全部超时,检查了一下代码发现dfs里面多算了一次dep,导致在getmax里面跳不出来。
下面正确代码
4、货车运输
(bus.cpp/c/pas)
【问题描述】
A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限
制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最
多能运多重的货物。
【输入格式】
第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道路。
接下来 m 行每行 3 个整数 x、y、z,每两个整数之间用一个空格隔开,表示从 x 号城市到
y 号城市有一条限重为 z 的道路。注意:x 不等于 y,两座城市之间可能有多条道路。
接下来一行有一个整数 q,表示有 q 辆货车需要运货。
接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市运输
货物到 y 城市,注意:x 不等于 y。
【输出格式】
输出共有 q 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货车不能到
达目的地,输出-1。
【输入输出样例】
bus.in bus.out
4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
3
-1
3
【数据范围】
对于 30%的数据,0 < n < 1,000,0 < m < 10,000,0 < q < 1,000;
对于 60%的数据,0 < n < 1,000,0 < m < 50,000,0 < q < 1,000;
对于 100%的数据, 0 < n < 10,000, 0 < m < 50,000, 0 < q < 30,000, 0 ≤ z ≤ 100,000。
方法同邦德市,简直一模一样。
交上去从第一个开始全部超时,检查了一下代码发现dfs里面多算了一次dep,导致在getmax里面跳不出来。
void dfs(int x,int y,int z) { fa[x]=y; dep[x]=z; for(int i=0;i<p[x].size();i++) { int j=p[x][i]; if(j==y) continue; dist[j]=q[x][i]; dep[j]=dep[x]+1; dfs(j,x,z+1); } }
下面正确代码
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<cmath> #include<iostream> #define maxn 100005 #define inf 11111111111111111 using namespace std; struct data { int a,b,l; }; int n,m,x,y,z,t; long long oo=0,ans=inf; int fa[maxn],ha[maxn],dep[maxn]={0},dist[maxn]={0}; vector<data>g; vector<int>p[maxn],q[maxn]; bool vis[300005]={0}; void clear() { for(int i=1;i<=n;i++) fa[i]=ha[i]=i; } int find(int x) { if(fa[x]==x) return x; int t=find(fa[x]); fa[x]=t; return t; } void Union(int x,int y) { fa[find(x)]=find(y); } bool check(int x,int y) { return find(x)==find(y); } int getmax(int x,int y) { int Max=1000000000; if(dep[x]<dep[y]) swap(x,y); while(dep[x]!=dep[y]) { Max=min(Max,dist[x]-dist[fa[x]]); x=fa[x]; } while(x!=y) { Max=min(Max,dist[x]-dist[fa[x]]); Max=min(Max,dist[y]-dist[fa[y]]); x=fa[x]; y=fa[y]; } return Max; } bool cmp(data xx,data yy) { return xx.l>yy.l; } void task() { for(int i=0;i<g.size();i++) { int u=g[i].a,v=g[i].b; if(check(u,v)) continue; Union(u,v); p[u].push_back(v); p[v].push_back(u); q[v].push_back(g[i].l); q[u].push_back(g[i].l); vis[i]=true; oo=g[i].l; } } void fuck(int x,int y,int z) { fa[x]=y; dep[x]=z; for(int i=0;i<p[x].size();i++) { int j=p[x][i]; if(j==y) continue; dist[j]=dist[x]+q[x][i]; fuck(j,x,z+1); } } int main() { freopen("bus.in","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); g.push_back((data){x,y,z}); g.push_back((data){y,x,z}); } sort(g.begin(),g.end(),cmp); clear(); task(); fuck(1,1,1); scanf("%d",&t); while(t--) { scanf("%d%d",&x,&y); if(y>x) swap(x,y); int ans=getmax(x,y); printf("%d\n",ans); } return 0; }
相关文章推荐
- 基于Scrapy框架的python网络爬虫学习(2)
- 单例模式
- ORIGIN 9.0 拟合曲线延伸
- 集合转换为Json数组
- HTML5笔记二:历史管理history
- UESTC - 149 解救小Q
- 【腾讯优测干货分享】Android5.0-6.0双卡适配指南
- jquery移动元素位置
- JS-正则表达式4
- 点击按扭后显示DIV,当然这个DIV 就显示在按扭旁边,当鼠标移动到DIV上时无变化,当鼠标移出DIV的时候,让DIV隐藏
- js轮播图代码分享
- 香蕉派 banana pi BPI-M64 四核心64位开源单板计算机 全志A64方案
- C# 线程同步
- 我们添加了两个短裤!
- 直方图均衡化
- Android开发,关于Canvas的使用,绘图的各种用法
- mongodb 数组内容匹配删除方法, $all 用法
- 转学习笔记:Caffe上配置和运行MNIST
- 卷积神经网络
- The type java.lang.Object cannot be resolved.