cogs——1364. 聚会

1364. 聚会

★   输入文件:partyb.in   输出文件:partyb.out   简单对比
时间限制:1 s   内存限制:128 MB

 

【问题描述】

小S想要从某地出发去同学k的家中参加一个party,但要有去有回。他想让所用的时间尽量的短。但他又想知道从不同的点出发,来回的最短时间中最长的时间是多少,

这个任务就交给了你。

【输入格式】

第一行三个正整数n,m,k(n是节点个数,m是有向边的条数,k是参加聚会的地点编号)(1 ≤ N ≤ 1000 ,1 ≤ M ≤ 100,000)

第二行..m+1行每行3个整数x,y,w 代表从x到y需要花w的时间(1 ≤ w≤ 100)

【输出格式】

  输出从不同的节点出发的最短时间中最长的时间。

【样例输入】

4 8 2

1 2 4

1 3 2

1 4 7

2 1 1

2 3 5

3 1 2

3 4 4

4 2 3

【样例输出】

10

 

建反向边,跑最短路。spfa

#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 210000
#define maxn 9999999
using namespace std;
int n,m,k,x,y,z,tot,ans,dis[N],head[N],sum[N];
int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
struct A
{
    int x,y,z;
}a[N];
struct Edge
{
    int from,to,next,dis;
}edge[N];
void add(int x,int y,int z)
{
    tot++;
    edge[tot].to=y;
    edge[tot].dis=z;
    edge[tot].next=head[x];
    head[x]=tot;
}
int spfa(int s)
{
    queue<int>q; bool vis[N];
    for(int i=1;i<=n;i++) dis[i]=maxn,vis[i]=false;
    q.push(s);vis[s]=true,dis[s]=0;
    while(!q.empty())
    {
        int x=q.front();q.pop();
        for(int i=head[x];i;i=edge[i].next)
        {
            int t=edge[i].to;
            if(dis[t]>dis[x]+edge[i].dis)
            {
                dis[t]=dis[x]+edge[i].dis;
                if(!vis[t])
                {
                    q.push(t);
                    vis[t]=true;
                }
            }
        }
        vis[x]=false;
    }
}
int main()
{
    freopen("partyb.in","r",stdin);
    freopen("partyb.out","w",stdout);
    n=read(),m=read(),k=read();
    for(int i=1;i<=m;i++)
    {
        x=read(),y=read(),z=read(),add(x,y,z);
        a[i].x=x;a[i].y=y;a[i].z=z;
     } 
    spfa(k);
    for(int i=1;i<=n;i++) sum[i]+=dis[i];
    tot=0;memset(edge,0,sizeof(edge));
    memset(head,0,sizeof(head));
    for(int i=1;i<=m;i++)
      add(a[i].y,a[i].x,a[i].z);
    spfa(k);
    for(int i=1;i<=n;i++) sum[i]+=dis[i];
    for(int i=1;i<=n;i++)
     if(sum[i]<maxn)
      ans=max(ans,sum[i]);
    printf("%d",ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/z360/p/7416343.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值