码迷,mamicode.com
首页 > 其他好文 > 详细

cogs——1364. 聚会

时间:2017-08-23 10:37:12      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:ios   blog   限制   sum   内存   color   int   需要   log   

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;
}

 

cogs——1364. 聚会

标签:ios   blog   限制   sum   内存   color   int   需要   log   

原文地址:http://www.cnblogs.com/z360/p/7416343.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!