NEUQ图灵杯之A题——蔡老板的会议

题目意思很简单,就是求最短路,但是,路径是单向的,所以要正着dij一遍,反着dij一遍,再求两次和的最大值,也可以创建两个图,这样,只要对两个图分别dij一遍一次,就不要写两个dij函数了,普通dij很久没复习了,来学习一下堆优化后的dij吧,提交代码只要了35ms的时间。

问题 A: 蔡老板的会议

时间限制: 2 Sec   内存限制: 128 MB
提交: 269   解决: 27
[ 提交][ 状态][ 讨论版]

   题目描述

     图灵杯个人赛就要开始了,蔡老板召集俱乐部各部门的部长开会。综合楼有N (1<=N<=1000)间办公室,

     编号1~N每个办公室有一个部长在工(mo)      作(yu),

      其中X号是蔡老板的办公室,会议也将在X(1<=X<=N)号办公室举行。综合楼的构造极其特殊,

     这N个办公室之间M(1<=M<=100,000)条单向      走廊。通过第i条路将需要花费Ti(1<=Ti<=100)单位时间。
     由于工作很忙,开完会之后各部长需要返回自己的办公室。他们会选择最短时间的最优路径。
     为了合理安排接下来的工作,蔡老板想知道,【来回最久的】【!!!】那个部长在路上花费的时间是多少。

   输入

     第一行:用空格隔开的三个数N,M和X
     接下来的M行:每行有用空格隔开的三个数Ai,Bi和Ti,表示从A点到B点花费的时间Ti

   输出

      一个int型的数,表示花费时间的最大值

    样例输入

       4 4 1
       1 2 1
       2 3 1
       3 4 3
       4 1 3

    样例输出

       8

:首先来是两个结构体

struct qnode{
    int v,c;
    qnode(int _v=0,int _c=0):v(_v),c(_c){}
    bool operator <(const qnode &r)const
    {
        return c>r.c;
    }
};

优先队列结构体,

重载qnode(int _v=0,int _c=0):v(_v),c(_c){}
bool operator <(const qnode &r)const
    {
        return c>r.c;
    }
//自动排序
struct edge
{
  int v,cost;
  edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
v是图上的点,cost是权值。
再来建图函数:
void addedge(int u,int v,int w){
    E[u].push_back(edge(v,w));
}
堆E是一个图,E【u】.push_back是在堆E的u的这一个一维数组末尾加上一个信息,u是起始点v是到达点,cost是u到v的权值。(vector用法)。
代码如下:
#include <iostream>
#include <vector>
#include <stdio.h>
#include <queue>
#include <string.h>
#define MAXX 0x3f3f3f3f
#define siz 1005
using namespace std;
struct qnode{
    int v,c;
    qnode(int _v=0,int _c=0):v(_v),c(_c){}
    bool operator <(const qnode &r)const
    {
        return c>r.c;
    }
};
struct edge
{
  int v,cost;
  edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
vector<edge>E[siz];
vector<edge>EE[siz];
int vis[siz];
int dist[siz];
int distt[siz];
int n,m,x;
int ans;
void dijstra(int n,int start){
    int i,j;
    memset(vis,0,sizeof(vis));
    for(i=1;i<=n;i++){
        dist[i]=MAXX;
    }
    priority_queue<qnode>que;
    while(!que.empty()){
        que.pop();
    }
    dist[start]=0;
    que.push(qnode(start,0));
    qnode tmp;
    while(!que.empty())
    {
        tmp=que.top();
        que.pop();
        int u=tmp.v;
        if(vis[u]==1) continue;
        vis[u]=1;
        for(j=0;j<E[u].size();j++)
        {
            int v=E[tmp.v][j].v;
            int cost=E[u][j].cost;
            if(!vis[v]&&dist[v]>dist[u]+cost){
                dist[v]=dist[u]+cost;
                que.push(qnode(v,dist[v]));
            }
        }
    }
}
void dijstra2(int n,int start){
    int i,j;
    memset(vis,0,sizeof(vis));
    for(i=1;i<=n;i++){
        distt[i]=MAXX;
    }
    priority_queue<qnode>que;
    while(!que.empty()){
        que.pop();
    }
    distt[start]=0;
    que.push(qnode(start,0));
    qnode tmp;
    while(!que.empty())
    {
        tmp=que.top();
        que.pop();
        int u=tmp.v;
        if(vis[u]==1) continue;
        vis[u]=1;
        for(j=0;j<EE[u].size();j++)
        {
            int v=EE[tmp.v][j].v;
            int cost=EE[u][j].cost;
            if(!vis[v]&&distt[v]>distt[u]+cost){
                distt[v]=distt[u]+cost;
                que.push(qnode(v,distt[v]));
            }
        }
    }
}
void addedge(int u,int v,int w){
    E[u].push_back(edge(v,w));
}
void addedge2(int u,int v,int w){
    EE[u].push_back(edge(v,w));
}
int main()
{
    while(scanf("%d%d%d",&n,&m,&x)!=EOF){
        int a,b,t;
        int i,j;
        for(i=0;i<siz;i++){
            E[i].clear();
            EE[i].clear();
        }
        for(i=0;i<m;i++){
            scanf("%d%d%d",&a,&b,&t);
            addedge(a,b,t);
            addedge2(b,a,t);
        }
        ans=0;
        dijstra(n,x);
        dijstra2(n,x);
        for(i=1;i<=n;i++){
          dist[i]=dist[i]+distt[i];
        }
        ans=-1;
        for(i=1;i<=n;i++){
            if(dist[i]>ans) ans=dist[i];
        }
        cout<<ans<<endl;
    }
    return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
热防护服是高温环境工作人群的重要保障,本文通过建立数学模型对多层热防护织物内部传热规律进行研究,建立防护服装内部的热传递模型,从而解决外界环境温度一定时,防护服各层随时间变化的温度分布问和各层织物材料的最优厚度问。 假人处于恒高温环境中,不考虑防护服织物的边缘热量损失,且人体和防护服的空气间隔很小,忽略空气的自然对流,只考虑热传导;故可以把织物视为导热多层平面,且属于非稳态导热过程。建立“高温环境-防护服-假人体表”系统;由傅里叶定律描述导热速率,将温度的变化转是能量传递的结果,将其看作电磁波的辐射和介质中对电磁波的传输问。 防护服中的温度分布由时间和防护服与外界热源相对位置二者共同决定的二元函数,因为二元偏微分方程的解析解无法精确求出,所以对时间进行离散化分析,分析以一秒为单位时间的温度变化与位置的关系,从而对问进行简化。 针对问一,将各层的导热过程抽象简化处理转换为平板中非稳态导热过程,在平板厚度的四周绝热良好时,从传热的角度上将问简化为一个一维传热问;从假人皮肤外侧的温度变化入手,根据热量的流向和生热情况从第Ⅳ层、第III层、第Ⅱ层、第Ⅰ层反向递推出和外界环境温度的关系,引入能温转换系数,建立假人皮肤外侧温度变化和外界温度的等式关系,最后利用最小二乘法设计程序,求出每一阶段的温度分布平差之后的结果,从而得到温度分布。 针对问二,考虑在一小时内该系统温度变化,用时间限制与温度阈值限制作为约束条件的规划问,沿用离散化分析手段,由假人体表温度逆推防护服第Ⅱ层厚度的表达式,建立其与外界温度的关系,并寻求满足条件下的最优解。 针对问三,考虑在给定半小时时间内该系统温度变化,添加更多的约束条件,对问二中的求解模型进行进一步优化,利用lingo寻找第Ⅱ、Ⅳ层厚度的最优解,并沿用前问中离散化分析手段,由假人体表温度逆推防护服相关设计参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值