• codevs 1992 聚会


    两点注意。

    第一点,建反边spfa完美解决去程的问题。

    第二点,有些是永远也到不了的,要舍掉这些距离!!!

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #define maxv 1005
    #define maxe 100005
    using namespace std;
    queue <long long> q;
    struct edge
    {
    long long v,w,nxt;
    }e1[maxe],e2[maxe];
    long long n,m,k,dis1[maxv],dis2[maxv],a,b,c;
    long long g1[maxv],g2[maxv],nume1=0,nume2=0;
    bool vis[maxv];
    void addedge(long long u,long long v,long long w)
    {
    e1[++nume1].v=v;
    e1[nume1].w=w;
    e1[nume1].nxt=g1[u];
    g1[u]=nume1;
    e2[++nume2].v=u;
    e2[nume2].w=w;
    e2[nume2].nxt=g2[v];
    g2[v]=nume2;
    }
    void spfa()
    {
    memset(dis1,0x3f,sizeof(dis1));
    memset(dis2,0x3f,sizeof(dis2));
    memset(vis,false,sizeof(vis));
    while (!q.empty())
    q.pop();
    q.push(k);
    vis[k]=true;
    dis1[k]=0;
    while (!q.empty())
    {
    long long head=q.front();
    q.pop();
    for (long long i=g1[head];i;i=e1[i].nxt)
    {
    long long v=e1[i].v;
    if (dis1[v]>dis1[head]+e1[i].w)
    {
    dis1[v]=dis1[head]+e1[i].w;
    if (vis[v]==false)
    {
    q.push(v);
    vis[v]=true;
    }
    }
    }
    vis[head]=false;
    }
    memset(vis,false,sizeof(vis));
    while (!q.empty())
    q.pop();
    q.push(k);
    vis[k]=true;
    dis2[k]=0;
    while (!q.empty())
    {
    long long head=q.front();
    q.pop();
    for (long long i=g2[head];i;i=e2[i].nxt)
    {
    long long v=e2[i].v;
    if (dis2[v]>dis2[head]+e2[i].w)
    {
    dis2[v]=dis2[head]+e2[i].w;
    if (vis[v]==false)
    {
    q.push(v);
    vis[v]=true;
    }
    }
    }
    vis[head]=false;
    }
    }
    int main()
    {
    scanf("%lld%lld%lld",&n,&m,&k);
    for (long long i=1;i<=m;i++)
    {
    scanf("%lld%lld%lld",&a,&b,&c);
    addedge(a,b,c);
    }
    spfa();
    for (long long i=1;i<=n;i++)
    dis1[i]=dis1[i]+dis2[i];
    sort(dis1+1,dis1+n+1);
    for (int i=n;i>=1;i--)
    {
    if (dis1[i]<10000000)
    {
    printf("%d ",dis1[i]);
    break;
    }
    }
    return 0;
    }

  • 相关阅读:
    Spring创建对象的方法
    Spring学习笔记1
    WIN7系统TortoiseSVN右键没有菜单解决办法
    TotoiseSVN的基本使用方法
    sql语句中where 1=1和 0=1 的作用
    windows批处理命令教程
    Mysql之B树索引
    Mysql与索引有关的树的概念
    Mysql索引简介
    Mysql之explain详解
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5184975.html
Copyright © 2020-2023  润新知