第四届图灵杯程序设计竞赛

第四届“图灵杯”NEUQ-ACM程序设计竞赛(个人赛)

                                                                                                             2016-11-19

问题 A: 蔡老板的会议

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

题目描述

图灵杯个人赛就要开始了,蔡老板召集俱乐部各部门的部长开会。综合楼有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

这是在最短路里面找到最长的那条,再求X到最长的那个点的距离。其实就是最短路。

#include <iostream>
#include<stdio.h>
#include<string.h>
#define siz 1005
#define inf 9999999
using namespace std;
long long int gx[siz][siz],gy[siz][siz];
long long int dx[siz],dy[siz];
int vis[siz];
int n,m,x;
int main()
{
    int a,b,t;
    while(scanf("%d %d %d",&n,&m,&x)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        for(int i=1; i<=n; i++){
            for(int j=1; j<=n; j++)
                gx[i][j]=gy[i][j]=inf;
            //gx[i][i]=gy[i][i]=0;
        }
        for(int i=1;i<=m;i++){
            scanf("%d %d %d",&a,&b,&t);
            if(gx[a][b]>t) gx[a][b]=t;
            if(gy[b][a]>t) gy[b][a]=t;
        }
 
        for(int i=1;i<=n;i++) dx[i]=gx[x][i];
        vis[x]=1, dx[x]=0;
        while(1){
            int v=-1,mx=inf;
            for(int i=1;i<=n;i++)
            {
                if(!vis[i]&&dx[i]<mx) mx=dx[i], v=i;
            }
            if(v==-1) break;
            vis[v]=1;
            for(int i=1;i<=n;i++)
            {
                if(!vis[i]&&dx[i]>dx[v]+gx[v][i])
                    dx[i]=dx[v]+gx[v][i];
            }
        }
        ///--------------------------
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++) dy[i]=gy[x][i];
        vis[x]=1, dy[x]=0;
        while(1){
            int v=-1, mx=inf;
            for(int i=1;i<=n;i++)
            {
                if(!vis[i]&&dy[i]<mx) mx=dy[i], v=i;
            }
            if(v==-1) break;
            vis[v]=1;
            for(int i=1;i<=n;i++)
            {
                if(!vis[i]&&dy[i]>gy[v][i]+dy[v])
                    dy[i]=gy[v][i]+dy[v];
            }
       
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值