`
huyifan951124
  • 浏览: 83181 次
社区版块
存档分类
最新评论

Poj3268 spfa算法应用

 
阅读更多

题目大意:来自n个农场的n头牛去一个给定的x农场吃草,来回都走最短路,这几个牛所走过的最大的路是多少。

算法思想:spfa的应用,对每头牛去的时候搞一次spfa,回来的时候在搞一次spfa,再将这两段距离之和相加。最后在维护一下最大值输出即可。

如果不大清楚spfa算法,可以参考下http://huyifan951124.iteye.com/blog/2315252

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define INF -0x3f3f3f3f
#define INF2 0x3f3f3f3f
int n, m, x;
int a,b,c,e,Max,flag,flag2;
typedef struct Edge
{
    int u;
    int v;
    int c;
};
Edge edges[200050];
int next[200050],head[1005],dist[1005];
bool visited[1005];
void addnode(int u,int v,int c)
{
    edges[e].u=u;
    edges[e].v=v;
    edges[e].c=c;
    next[e]=head[u];
    head[u]=e++;
}
bool relax(int u,int v,int c)
{
    if(dist[v]>dist[u]+c)
    {
        dist[v]=dist[u]+c;
        return true;
    }
    return false;
}
int spfa(int src,int x)
{
    memset(visited,false,sizeof(visited));

    for(int i=1;i<=n;i++)
    {
        dist[i]=INF2;
    }
    dist[src]=0;
    queue<int>que;
    que.push(src);
    visited[src]=true;
    while(!que.empty())
    {
        int q=que.front();
        que.pop();
        visited[q]=false;
        for(int i=head[q];i+1;i=next[i])
        {
            if(relax(q,edges[i].v,edges[i].c)&&!visited[edges[i].v])
            {
                visited[edges[i].v]=true;
                que.push(edges[i].v);
            }
        }
    }
    return dist[x];
}
int main()
{
    memset(head,-1,sizeof(head));
    memset(next,-1,sizeof(next));
    scanf("%d%d%d",&n,&m,&x);

    e=1;Max=INF;

    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        addnode(a,b,c);
    }
    for(int i=1;i<=n;i++)
    {
        flag=-1;
        if(i==x)
            continue;
        flag=spfa(i,x);
        flag2=spfa(x,i);
        if(Max<(flag2+flag))
            Max=flag2+flag;
    }

    printf("%d\n",Max);


    return 0;

}

 

分享到:
评论

相关推荐

    SPFA算法.doc

    SPFA算法的核心优化在于,它只对那些在上一次松弛操作中导致距离估计值改变的顶点进行处理。初始时,源点入队,然后在每次迭代中,取出队首的顶点,对其邻接点进行松弛操作。如果某个邻接点的路径被缩短,且该邻接点...

    最小费用流的原始对偶 (Primal-Dual) 算法.docx

    6. Small Label First 优化:该优化是指在SPFA算法中,优先选择小的距离标号,以提高算法的效率。 7. 多路增广:该概念是指在计算最大流时,使用多条路径来增广流量,以提高算法的效率。 8. Dijkstra 算法:该算法...

    poj pku图论、网络流入门题总结、汇总

    - **解题思路:** 通过Bellman-Ford或SPFA算法求解单源最短路径问题,并在此基础上通过额外条件筛选出最优解。 - **注意事项:** Bellman-Ford算法可以处理含有负权边的情况,而SPFA算法则在处理大规模图时具有更好...

    poj 图论 集合

    根据提供的文件信息,本文将对其中提及的几个POJ(Peking University Judge Online)平台上的图论题目进行详细的解析,并介绍解决这些问题时所使用的算法和技术。这些题目涵盖了图论中的多个核心概念,如最短路径、...

    图论拾遗(一)题解1

    在寻找K短路时,先反向运行SPFA算法计算汇点到所有点的最短距离作为h(x),然后在A*搜索中直接入队,当节点入队次数等于K时得到结果。 POJ3463同样是一个中等难度的题目,情况更为复杂。如果源点S到汇点T的次短路径...

    最优匹配题解1

    KM算法的时间复杂度为O(N^3),对于较小规模的问题,它的效率往往优于基于SPFA的费用流算法,后者的时间复杂度在O(N*E^2)到O(N^2*E)之间,对于稠密图来说可能效率较低。 在POJ3686题目中,问题转变为优化订单完成...

    ACM题目大汇总

    - **解法**:通常采用参数搜索(二分查找)结合最短路径算法(Bellman-Ford或SPFA)。 6. **POJ3635 fulltank?** - **题意**:这是一个最短路径问题的变种。 - **解法**:可以使用广度优先搜索(BFS)来解决。 ...

    lanqiao_杭电ACMOJ解题报告_规划_

    显示了实际的编程练习题目,比如"UVA-11624失败.cpp"和"POJ-1511-Invitation-Cards.cpp"等,这些文件可能对应着特定的ACM竞赛题目,通过查看和分析这些源代码,可以学习到如何应用上述算法来解决具体问题,例如优化...

    ACM之路的计划

    * 图论:使用优先队列优化 Dijkstra 和 Prim、单源最短路径之 SPFA、差分约束系统、多源多点最短路径之 FloydWarshall 算法、求欧拉路 * 模拟题训练:进行复杂模拟题训练 * 拓扑排序 * 动态规划进阶:完全背包、多重...

    感觉比较好的一个数据结构知识的总结 .docx

    - 辅助算法,如广度优先搜索(BFS)、最短路径算法SPFA等。 - 实现循环队列时应避免使用取模运算,以免影响性能。 ##### 3. 双端队列 - **定义**:双端队列是一种可以在两端进行插入和删除操作的数据结构。 - **...

    差分约束系统题解1

    【差分约束系统】是一种用于解决一系列线性不等式约束问题的模型,常用于最优化问题,如求解最短路径、...在解决具体问题时,理解Dist数组的含义,正确构建边,以及选择合适的最短路径算法(如SPFA)是解决问题的关键。

    kuangbin acm模板超级好用

    2.3 扩展欧几里得算法(求 ax+by=gcd 的解以及逆元) . . . . . . . . . . . . . . . 27 2.4 求逆元 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.4.1 扩展欧几里德法 ...

Global site tag (gtag.js) - Google Analytics