2015山东信息学夏令营 Day4T3 生产

【题目描述】

工厂为了生产一种复杂的产品,给各个生产部门制定了详细的生产计划。那么,就经常会有生产部门要把产品送到另一个生产部门作为原料。这是一个注重产品质量的工厂,所以每当有产品要从A部门运到B部门时,都要先从A部门送到质量检验处,检验合格后再从质量检验处运到B部门。

有些部门之间有传送带连接,厂长想知道每次将产品从一个部门运送到另一个部门最少需要多长时间。

【输入格式】

第一行两个整数n、m,n表示部门数量,m表示传送带数量。出于方便,1号部门是质量检验处。

接下来m行,每行三个整数u、v、w,表示有一条从u部门到v部门的传送带,传送过去需要w个单位时间。注意传送带是单向的。

接下来一个整数q,表示有q次运送。

接下来q行,每行两个数a、b,表示这一次要将产品从a部门运送到b部门。

【输出格式】

输出q行,每行一个整数,表示这次运送最少需要的时间。若没有传送方案,输出-1。

【样例输入】

5 5

1 2 3

1 3 5

4 1 7

5 4 1

5 3 1

3

4 2

5 3

2 3

【样例输出】

10

13

-1

【数据规模与约定】

30%的数据,n≤100,m≤500,w=1

60%的数据,n≤100,m≤5000

另20%的数据,q=1

100%的数据,2≤n≤3000,m≤100000,2≤a,b≤n,

q≤100000,1≤u,v≤n,1≤w≤10000

有些部门之间可能有多条传送带。

工厂的员工都非常尽职尽责,他们的认真和热情决定了产品的完美,所以不必考虑产品不合格的情况。

思路:

1、最短路,A到1再到B的距离,等于1到B的距离加上1到A的距离

2、存者正反两个图,在反图上求1到A距离,在正图上求1到B的距离

代码:

①官方标程(spfa + 链式前向星)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 3050;
const int M = 500050;
const int inf = 987654321;
int n,m,q;
struct Edge
{int u,v,w;
}xu[M];
int point[N],to[M],next[M],val[M];
int dui[N],mina[N],minb[N],top,tail;
bool indui[N];
void MakeMinLen(int x[])
{int i;dui[1]=1;top=0;tail=1;indui[1]=1;for(i=1;i<=n;i++)x[i]=inf;x[1]=0;while(top^tail){top++;if(top==N)top=0;int now=dui[top];int then=point[now];indui[now]=0;while(then){int tox=to[then];if(x[tox]>x[now]+val[then]){x[tox]=x[now]+val[then];if(!indui[tox]){indui[tox]=1;tail++;if(tail==N)tail=0;dui[tail]=tox;}}then=next[then];}}
}
void InitGraph()
{int i;scanf("%d%d",&n,&m);for(i=1;i<=m;i++)scanf("%d%d%d",&xu[i].u,&xu[i].v,&xu[i].w);memset(point,0,sizeof point);for(i=1;i<=m;i++){next[i]=point[xu[i].v];point[xu[i].v]=i;to[i]=xu[i].u;val[i]=xu[i].w;}MakeMinLen(mina);memset(point,0,sizeof point);for(i=1;i<=m;i++){next[i]=point[xu[i].u];point[xu[i].u]=i;to[i]=xu[i].v;val[i]=xu[i].w;}MakeMinLen(minb);
}
void MakeAns()
{scanf("%d",&q);while(q--){int a,b;scanf("%d%d",&a,&b);int res=mina[a]+minb[b];if(res>=inf)res=-1;printf("%d\n",res);}
}
int main()
{freopen("data.in","r",stdin);freopen("data.out","w",stdout);InitGraph();MakeAns();return 0;
}

②自己写的,感觉dij快一点,一测发现比标程慢不少TAT

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define inf ~0U>>2
#define maxn 3005
using namespace std;
struct orz{int d;int p;friend bool operator < (orz a,orz b){return a.d > b.d;}
};
struct edge{int v;int w;
};
priority_queue< orz > ss;
vector<edge> g[maxn],op[maxn];
int n,m,q,flag = 0,v[maxn],d[maxn],opd[maxn];
void init(){cin>>n>>m;int u,v,w;edge tmp;for(int i = 1;i <= m;i++){scanf("%d%d%d",&u,&v,&w);tmp.v = v;tmp.w = w;g[u].push_back(tmp);tmp.v = u;op[v].push_back(tmp);}cin>>q;for(int i = 1;i <= n;i++) d[i] = opd[i] = inf;
}
void dij(){orz tmp;tmp.d = 0;tmp.p = 1;opd[1] = 0;ss.push(tmp);flag++;int x,dd,to,wei;edge j;while(!ss.empty()){tmp = ss.top();ss.pop();x = tmp.p;dd = tmp.d;if(v[x] == flag) continue;v[x] = flag;for(int i = 0;i < g[x].size();i++){j = g[x][i];to = j.v;wei = j.w;if(d[to] > dd + wei){d[to] = dd + wei;tmp.d = dd + wei;tmp.p = to;ss.push(tmp);}}}
}
void opdij(){orz tmp;tmp.d = 0;tmp.p = 1;opd[1] = 0;ss.push(tmp);flag++;int x,dd,to,wei;edge j;while(!ss.empty()){tmp = ss.top();ss.pop();x = tmp.p;dd = tmp.d;if(v[x] == flag) continue;v[x] = flag;for(int i = 0;i < op[x].size();i++){j = op[x][i];to = j.v;wei = j.w;if(opd[to] > dd + wei){opd[to] = dd + wei;tmp.d = dd + wei;tmp.p = to;ss.push(tmp);}}}
}
void ask(){int u,v;long long dn;for(int i = 1;i <= q;i++){scanf("%d%d",&u,&v);dn = opd[u] + d[v];if(dn >= inf) cout<<-1<<endl;else cout<<dn<<endl;}
}
int main(){freopen("data.in","r",stdin);freopen("data.out","w",stdout);init();dij();opdij();ask();return 0;
}

转载于:https://www.cnblogs.com/hyfer/p/5811798.html

2015山东信息学夏令营 Day4T3 生产相关推荐

  1. 清华大学计算机相关夏令营,清华大学计算机系举办2014年信息学夏令营

    清华大学计算机系举办2014年信息学夏令营 清华新闻网6月20日电 (通讯员 丁 力)6月15日至6月16日,由清华大学教务处和计算机系联合举办的"清华大学拔尖创新人才选拔营之信息学夏令营& ...

  2. 山东省计算机专业专科排名2015,2015山东专科学校排名及排行榜

    原标题:2015山东专科学校排名及排行榜 点击查看>>> 深度推荐阅读: 1. 2.丨 3.丨 4. 5. 山东共有72所专科学校参与了2015山东专科学院排名,其中排名第一的是烟台 ...

  3. 2015山东春考计算机分数排名,2015-2017年山东春季高考分数线.docx

    2015-2017年山东春季高考分数线 2017年山东春季高考专科(高职)招生院校共有84所,详细招生院校如下(排名不分先后):山东医学高等专科学校.菏泽医学专科学校.齐鲁医药学院.山东商业职业技术学 ...

  4. 2015山东春考计算机分数排名,2015-2017年山东春季高考分数线.doc

    2015-2017年山东春季高考分数线 2015-2017年山东春季高考分数线 2017年山东春季高考专科(高职)招生院校共有84所,详细招生院校如下(排名不分先后):山东医学高等专科学校.菏泽医学专 ...

  5. 济南计算机学校排名2015,山东济南初中排行榜TOP10

    [导语]学作为向高等院校输送人才的源泉,是发展教育.培养人才的关键点.像省实验高中.历城二中早已成为济南人民眼中的典范.除了这几所学校,济南还有哪些好的中学呢?排名又是怎样的呢?今天小编就带大家来看看 ...

  6. 山东省计算机专科排名2015,山东专科大学前十名有哪些?山东所有专科大学排名榜单...

    众所周知,山东是我国高考的大省.全国的得分线是出了名的高.山东省也有许多学院和大学.山东众多大学中有哪些专业学院?以下第一个排名列出了山东省十大专科学校和山东省所有专科学校的排名名单,希望能为学生和家 ...

  7. 2021北大信息学夏令营游记

    前言 现在是2021年5月16日早上9:17,得知没有进入面试名单已经过了1小时. 真不知道我这1小时怎么熬过来的- 今天下午就要坐飞机走,明天周一,继续投入到参杂了更严格竞赛训练的文化课学习.节奏挺 ...

  8. 2015山东毕业生如何进行网上报道(报到证)?

    这两天 一直很头疼,报道证的问题,毕了业也是很蛋疼的问题.我真的不知道该怎么办,网络上都的都是一些垃圾.根不知 所云为何物?   然后自己摸索. 解决方案: 1 打电话问一下 比 报到证上面的 人事保 ...

  9. 彩色方块 2017信息学夏令营第二场

    NKOJ 4223 彩色方块 问题描述 何老板最近在玩一款叫"彩色方块"的小游戏,游戏虽然简单,但何老板仍旧乐此不疲. 游戏中有n个彩色方块成一排,方块的颜色用字母表示,给出目标排 ...

最新文章

  1. Microsoft Hyper-V Server 2012开启虚拟化-虚拟机管理
  2. in 和 exist 区别
  3. Python 资料性网站。
  4. B 树、B+ 树、B* 树
  5. 调试与对拍(一):生成测试数据+对拍
  6. 解析统计文本文件中的字符数、单词数、行数。
  7. GitHub Actions 持续集成
  8. 【渝粤教育】电大中专学习指南 (2)作业 题库
  9. json学习初体验--第三者jar包实现bean、List、map创json格式
  10. DataGrip连接不上本地localhost数据库解决办法
  11. 微信收款播报器提示服务器断开,微信收款语音提醒开启后收不到语音提醒怎么办? 专家详解...
  12. S2B2C模式有何优势?S2B2C电商系统赋能皮革企业渠道,提升供应链管理效率
  13. vue 打卡图片_掀起ins打卡潮的《小丑》台阶到底有什么魔力?
  14. 形式语言与自动机 Part.4 正则语言,2DFA,MealyMoore机
  15. 韩版机泛泰A850改mms.apk去除收到短信的国家代码
  16. C语言进阶第15式:逻辑运算符分析
  17. 航空专场 | 无人机设计仿真流程讲解与案例实操
  18. Tello无人机的使用笔记之dji-sdk/Tello-Python
  19. Rsa 非对称加密算法使用问题分享--使用通过密钥对同一段数据加密得到结果每次不一样
  20. Sheldon Numbers 暴力枚举

热门文章

  1. [原]SDL开发教程
  2. 复数矩阵QR分解算法的C++实现
  3. freeBSD时区设置与时间设置
  4. 在WEBSTART中实现串口通信(WINDOWS版)
  5. 什么是神经网络在object detection的应用?cascade classifier,卷积神经网络,迁移学习
  6. Google colab基本页面layout和需要注意的地方!
  7. SVN 提交子文件夹问题
  8. C++右值引用的参考
  9. Qwt(一): 编译 · 安装
  10. 驼峰设计 PPT设计网站