题目大意:给你村庄和村庄之间的距离和费用,如果这个村庄的费用可以无限小就输出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(Shortest Path Faster Algorithm)算法是一种用于解决图论中的单源最短路径问题的算法,它是贝尔曼-福特(Bellman-Ford)算法的一种优化版本,主要应用于求解带有负权重边的图的最短路径。SPFA通过使用队列...
poj 2679 Adventurous Driving.md
而"北大题目代码"很可能是一个包含北京大学学生或教师为POJ题目编写的解决方案的文件,可能包括C、C++、Java等编程语言的代码实现,每个文件对应一个具体的题目,有助于读者理解并学习如何应用算法来解决实际问题。...
* 深度优先搜索:深度优先搜索是指解决问题的深度优先搜索算法,如 poj2488、poj3083、poj3009、poj1321、poj2251。 * 广度优先搜索:广度优先搜索是指解决问题的广度优先搜索算法,如 poj3278、poj1426、poj3126、...
AC代码则展示了如何正确地应用这些算法来解决问题,并通过了POJ的系统测试。通过阅读解题报告和代码,你可以了解到每个问题的具体解决方案,同时也能加深对图算法的理解。 在学习过程中,建议先尝试自己独立解决...
POJ算法分类和题目推荐指南 本资源主要介绍了POJ(Online Judge)平台上各种算法分类和推荐题目,涵盖了动态规划、模拟、博弈等多种类型。以下是详细的知识点说明: 一、动态规划 动态规划是一种非常重要的算法...
根据提供的文件信息,我们可以将POJ练习题中的算法进行分类,并对每一类中的知识点进行详细的阐述。POJ(Pacific Ocean Judge)是一个在线编程平台,它提供了丰富的编程题目,旨在帮助学习者掌握各种基础算法和数据...
6. **图论算法**:包括图的遍历(深度优先搜索和广度优先搜索)、最短路径问题(Dijkstra算法、Floyd-Warshall算法)、最小生成树问题(Prim和Kruskal算法)。 7. **字符串处理**:如KMP算法、Rabin-Karp算法、...
POJ各题算法分类和题目推荐.pdf
【北大POJ初级-图算法】是一系列针对北京大学在线编程平台POJ(Problem Online Judge)上的初级编程题目,重点在于图论算法的应用。这个解题报告集合了多种图算法的实现,帮助学习者掌握如何在实际问题中运用这些...
poj 2488——dfs深度优先遍历 //给行数列数,求问能否遍历,给出字典序的一种遍历
在这个实验报告中,poj1087 题目就是一个典型的贪心算法应用实例。 题目描述了一个工厂需要将不同尺寸的产品(1*1 到 6*6)使用6*6的包裹进行包装,目标是最小化所需的包裹数量。贪心策略在此问题中的应用是逐个...
在本压缩包“poj算法题目实现.zip”中,包含了五个经典的编程竞赛题目,主要针对的是POJ(Programming Online Judge)平台。这些题目是程序员提升算法能力、锻炼编程技巧的重要资源。下面,我们将详细探讨每个题目...
标题中的“POJ 1078 算法”指的是北京大学在线判题系统(Problem Online Judge,简称POJ)中的第1077题,这通常是一个编程竞赛或者算法练习题目。POJ是一个供程序员练习算法、提交代码并获取运行结果的平台,主要...
根据提供的信息,我们可以将POJ(Peking Online Judge)平台上的算法题目按照不同的类别进行整理与解析。这对于希望系统性地提高自己算法能力的学习者来说非常有用。下面将基于给出的分类来详细介绍每一类算法的核心...
2. 搜索算法:深度优先搜索(DFS)和广度优先搜索(BFS),它们在图论和树结构问题中广泛应用。 3. 动态规划:解决最优化问题的利器,通过构建状态转移方程来求解问题。 4. 贪心算法:通过每一步选择局部最优解,...
3. **GCD算法**:最大公约数算法的扩展应用(poj3101)。 以上知识点覆盖了ACM-POJ算法训练指南的主要内容,对于初学者和竞赛者来说,熟练掌握这些算法和数据结构是提高编程能力、参加各类编程竞赛的关键。
POJ上的一道题目,自己写的代码,因为想下载别人的, 所以就放上了。
总的来说,"poj.org算法题解集合"是一个宝贵的资源,不仅提供了实际的代码实现,还展示了如何将理论知识应用于实际问题的解决,对于提高编程和算法技能大有裨益。无论是准备编程竞赛,还是提升日常开发能力,都可以...
该算法是融合了直接 SPFA 算法和 KM 重标号算法的优点,实现了最小费用流的计算。该算法的主要过程是反复交替进行最短路和最大流的计算,利用 Reduced Cost 缩小了费用范围,提高了算法的效率。 知识点: 1. 最小...