• T1992 聚会 codevs


    http://codevs.cn/problem/1992/

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
    题目描述 Description

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

    输入描述 Input Description

    第一行三个正整数n, m, k(n是节点个数,m是有向边的条数,k是参加聚会的地点
    编号)( 1 ≤ n ≤ 1000 ,1 ≤ m ≤ 100,000)
    第二行..m + 1行每行3个整数x,y,w 代表从x到y需要花w的时间 0<w<=100

    输出描述 Output Description

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

    样例输入 Sample Input

    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

    样例输出 Sample Output

    10

    数据范围及提示 Data Size & Hint

     

      1 #include <algorithm>
      2 #include <iostream>
      3 #include <cstring>
      4 #include <cstdio>
      5 #include <queue>
      6 #define maxn 1e7
      7 #define cnt 100015
      8 
      9 using namespace std;
     10 
     11 int n,m,k,x,y,z,tot,ans,most;
     12 int dis_go[cnt],head[cnt],dis_back[cnt];
     13 bool vis[cnt];
     14 struct node
     15 {
     16     int from,to,tim;
     17 }e[cnt];
     18 
     19 void add(int a,int b,int c)
     20 {
     21     tot++;
     22     e[tot].to=b;
     23     e[tot].tim=c;
     24     e[tot].from=head[a];
     25     head[a]=tot;
     26 }
     27 
     28 int Spfa_go(int s,int t)
     29 {
     30     for(int i=1;i<=n;i++) dis_go[i]=maxn;
     31     dis_go[s]=0;
     32     memset(vis,0,sizeof(vis));
     33     queue<int>que;
     34     que.push(s);
     35     vis[s]=1;
     36     while(!que.empty())
     37     {
     38         int now=que.front();
     39         que.pop(); vis[now]=0;
     40         for(int i=head[now];i!=-1;i=e[i].from)
     41         {
     42             if(dis_go[e[i].to]>dis_go[now]+e[i].tim)
     43             {
     44                 dis_go[e[i].to]=dis_go[now]+e[i].tim;
     45                 if(!vis[e[i].to])
     46                 {
     47                     que.push(e[i].to);
     48                     vis[e[i].to]=1;
     49                 }
     50             }
     51         }
     52     }
     53     return dis_go[t];
     54 }
     55 
     56 int Spfa_back(int s,int t)
     57 {
     58     for(int i=1;i<=n;i++)    dis_back[i]=maxn;
     59     dis_back[s]=0;
     60     memset(vis,0,sizeof(vis));
     61     queue<int>q;
     62     q.push(s);
     63     vis[s]=1;
     64     while(!q.empty())
     65     {
     66         int now=q.front();
     67         q.pop(); vis[now]=0;
     68         for(int i=head[now];i!=-1;i=e[i].from)
     69         {
     70             if(dis_back[e[i].to]>dis_back[now]+e[i].tim)
     71             {
     72                 dis_back[e[i].to]=dis_back[now]+e[i].tim;
     73                 if(!vis[e[i].to])
     74                 {
     75                     q.push(e[i].to);
     76                     vis[e[i].to]=1;
     77                 }
     78             }
     79         }
     80     }
     81     return dis_back[t];
     82 }
     83 
     84 int main()
     85 {
     86     scanf("%d%d%d",&n,&m,&k);
     87     memset(head,-1,sizeof(head));
     88     for(int i=1;i<=m;++i)
     89     {
     90         scanf("%d%d%d",&x,&y,&z);
     91         most+=z;
     92         add(x,y,z);
     93     }
     94     for(int i=1;i<=n;++i)
     95     {
     96         if(i==k) continue;
     97         tot=Spfa_go(i,k)+Spfa_back(k,i);
     98         if(tot<most)
     99         ans=max(ans,tot);
    100     }
    101     printf("%d",ans);
    102     return 0;
    103 }
    SPFA
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    P3146 [USACO16OPEN]248
    P2590 [ZJOI2008]树的统计
    P3379 【模板】最近公共祖先(LCA)
    P2253 好一个一中腰鼓!
    数组中出现次数超过一半的数字
    字符串的排列
    二叉搜索树与双向链表
    二叉搜索树的后序遍历序列
    从上往下打印二叉树
    顺时针打印矩阵
  • 原文地址:https://www.cnblogs.com/Shy-key/p/6568395.html
Copyright © 2020-2023  润新知