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

Poj2679 spfa算法深度应用

 
阅读更多

题目大意:给你村庄和村庄之间的距离和费用,如果这个村庄的费用可以无限小就输出UNBOUND,如果这两个村庄之间没有路就输出VOID,否则则输出在满足最小费用下的最短路。

算法思路:判断村庄费用无限小其实就是判断在所给的两个村庄a,b之间是否存在负环,注意全图存在负环但这两个村庄之间不存在负环的情况要考虑啊!因此我们要判断一下如果存在任意一个入队次数>n的点与b连通,或者本身b的入队次数就>n就说明a与b之间存在负环,输出UNBOUND,如果dist[b]==INF就说明a到不了b就输出VOID,否则输出最小费用和最小距离即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
int n,m,a,b,e,num1,num2,num3,num4,num5;
int head[2005],next[10050],dist[2005],dist2[2005];
bool visited[2005];
char str[50];
int num[2005];
bool flag;
typedef struct Edge
{
    int u;
    int v;
    int c;
    int value;
};
Edge edges[10050];
void addNode(int u,int v,int c,int value)
{
    //注意见图的时候这里要进行判断,某个点的单链表中如果有多条边的话,我们只取费用最小的那一个点组成单链表
    if(head[u]!=-1&&value>edges[head[u]].value)
        return;
    if(head[u]!=-1&&value<edges[head[u]].value)
        head[u]=-1;
    edges[e].u=u;
    edges[e].v=v;
    edges[e].c=c;
    edges[e].value=value;
    next[e]=head[u];
    head[u]=e++;
}
bool relax(int u,int v,int c,int value)
{

    if(dist2[v]>dist2[u]+value||dist2[v]==dist2[u]+value&&dist[v]>dist[u]+c)
    {
        dist2[v]=dist2[u]+value;
        dist[v]=dist[u]+c;
        return true;
    }

    return false;
}

bool spfa(int src)
{
    memset(visited,false,sizeof(visited));
    memset(num,0,sizeof(num));
    for(int i=0;i<n;i++)
    {
        dist[i]=INF;
        dist2[i]=INF;
    }
    dist[src]=0;
    dist2[src]=0;
    queue<int>que;
    visited[src]=true;
    que.push(src);

    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,edges[i].value)&&!visited[edges[i].v])
            {
                if(++num[edges[i].v]>n)
                    return false;
                visited[edges[i].v]=true;
                que.push(edges[i].v);
            }
        }

    }
    return true;
}
void dfs(int x,int y)
{
    visited[x]=true;
    if(x==y)//如果存在num[x]>n的点与结束点相连接的话,就标记
    {
        flag=true;
        return;
    }
    for(int i=head[x];i+1;i=next[i])
    {
            if(!visited[edges[i].v])
            {
                dfs(edges[i].v,y);
            }
    }
}
int main()
{
    while(~scanf("%d%d%d%d",&n,&m,&a,&b))
    {
        e=0;flag=false;
        memset(head,-1,sizeof(head));
        memset(next,-1,sizeof(next));
        memset(edges,0,sizeof(edges));
        for(int i=0; i<m; i++)
        {
            int sum=0;
            int nn=0;
            bool isfu=false;
            scanf("%s",str);
            sscanf(str,"(%d,%d,%d[%d]%d)",&num1,&num2,&num3,&num4,&num5);
            addNode(num1,num2,num4,num3);
            addNode(num2,num1,num4,num5);

        }


         bool ok=spfa(a);

        for(int i=0;i<n;i++)
        {
            if(num[i]>n)
            {
                  memset(visited,false,sizeof(visited));
                flag=false;
                dfs(i,b);
                if(flag)
                    break;

            }
        }

        if(dist[b]==INF)
        {
            printf("VOID\n");
        }
        else
        {
            if(ok)
                printf("%d %d\n",dist2[b],dist[b]);
            else
            {
                if(flag||num[b]>n)
                     printf("UNBOUND\n");
                else
                    printf("%d %d\n",dist2[b],dist[b]);
            }
        }


    }
}

 

分享到:
评论

相关推荐

    SPFA算法.doc

    SPFA(Shortest Path Faster Algorithm)算法是一种用于解决图论中的单源最短路径问题的算法,它是贝尔曼-福特(Bellman-Ford)算法的一种优化版本,主要应用于求解带有负权重边的图的最短路径。SPFA通过使用队列...

    poj 2679 Adventurous Driving.md

    poj 2679 Adventurous Driving.md

    poj acm 题解 算法

    而"北大题目代码"很可能是一个包含北京大学学生或教师为POJ题目编写的解决方案的文件,可能包括C、C++、Java等编程语言的代码实现,每个文件对应一个具体的题目,有助于读者理解并学习如何应用算法来解决实际问题。...

    POJ算法题目分类

    * 深度优先搜索:深度优先搜索是指解决问题的深度优先搜索算法,如 poj2488、poj3083、poj3009、poj1321、poj2251。 * 广度优先搜索:广度优先搜索是指解决问题的广度优先搜索算法,如 poj3278、poj1426、poj3126、...

    POJ中级图算法所有题目【解题报告+AC代码】

    AC代码则展示了如何正确地应用这些算法来解决问题,并通过了POJ的系统测试。通过阅读解题报告和代码,你可以了解到每个问题的具体解决方案,同时也能加深对图算法的理解。 在学习过程中,建议先尝试自己独立解决...

    POJ各题算法分类和题目推荐 ACM必看

    POJ算法分类和题目推荐指南 本资源主要介绍了POJ(Online Judge)平台上各种算法分类和推荐题目,涵盖了动态规划、模拟、博弈等多种类型。以下是详细的知识点说明: 一、动态规划 动态规划是一种非常重要的算法...

    POJ练习题算法分类

    根据提供的文件信息,我们可以将POJ练习题中的算法进行分类,并对每一类中的知识点进行详细的阐述。POJ(Pacific Ocean Judge)是一个在线编程平台,它提供了丰富的编程题目,旨在帮助学习者掌握各种基础算法和数据...

    北大POJ初级-基本算法

    6. **图论算法**:包括图的遍历(深度优先搜索和广度优先搜索)、最短路径问题(Dijkstra算法、Floyd-Warshall算法)、最小生成树问题(Prim和Kruskal算法)。 7. **字符串处理**:如KMP算法、Rabin-Karp算法、...

    POJ各题算法分类和题目推荐.pdf

    POJ各题算法分类和题目推荐.pdf

    北大POJ初级-图算法

    【北大POJ初级-图算法】是一系列针对北京大学在线编程平台POJ(Problem Online Judge)上的初级编程题目,重点在于图论算法的应用。这个解题报告集合了多种图算法的实现,帮助学习者掌握如何在实际问题中运用这些...

    poj2488——dfs深度优先遍历

    poj 2488——dfs深度优先遍历 //给行数列数,求问能否遍历,给出字典序的一种遍历

    poj1087贪心算法实验报告

    在这个实验报告中,poj1087 题目就是一个典型的贪心算法应用实例。 题目描述了一个工厂需要将不同尺寸的产品(1*1 到 6*6)使用6*6的包裹进行包装,目标是最小化所需的包裹数量。贪心策略在此问题中的应用是逐个...

    poj算法题目实现.zip_algorithm_arrangement4hv_conditionyis_poj problems

    在本压缩包“poj算法题目实现.zip”中,包含了五个经典的编程竞赛题目,主要针对的是POJ(Programming Online Judge)平台。这些题目是程序员提升算法能力、锻炼编程技巧的重要资源。下面,我们将详细探讨每个题目...

    POJ 1077 算法

    标题中的“POJ 1078 算法”指的是北京大学在线判题系统(Problem Online Judge,简称POJ)中的第1077题,这通常是一个编程竞赛或者算法练习题目。POJ是一个供程序员练习算法、提交代码并获取运行结果的平台,主要...

    poj上算法题目分类

    根据提供的信息,我们可以将POJ(Peking Online Judge)平台上的算法题目按照不同的类别进行整理与解析。这对于希望系统性地提高自己算法能力的学习者来说非常有用。下面将基于给出的分类来详细介绍每一类算法的核心...

    北大POJ中级-基本算法

    2. 搜索算法:深度优先搜索(DFS)和广度优先搜索(BFS),它们在图论和树结构问题中广泛应用。 3. 动态规划:解决最优化问题的利器,通过构建状态转移方程来求解问题。 4. 贪心算法:通过每一步选择局部最优解,...

    ACM-POJ 算法训练指南

    3. **GCD算法**:最大公约数算法的扩展应用(poj3101)。 以上知识点覆盖了ACM-POJ算法训练指南的主要内容,对于初学者和竞赛者来说,熟练掌握这些算法和数据结构是提高编程能力、参加各类编程竞赛的关键。

    POJ 1015 动态规划

    POJ上的一道题目,自己写的代码,因为想下载别人的, 所以就放上了。

    poj:在poj.org上做的一些算法题

    总的来说,"poj.org算法题解集合"是一个宝贵的资源,不仅提供了实际的代码实现,还展示了如何将理论知识应用于实际问题的解决,对于提高编程和算法技能大有裨益。无论是准备编程竞赛,还是提升日常开发能力,都可以...

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

    该算法是融合了直接 SPFA 算法和 KM 重标号算法的优点,实现了最小费用流的计算。该算法的主要过程是反复交替进行最短路和最大流的计算,利用 Reduced Cost 缩小了费用范围,提高了算法的效率。 知识点: 1. 最小...

Global site tag (gtag.js) - Google Analytics