Poj(2679),SPFA,二级比较
题目链接:http://poj.org/problem?id=2679
嗯,思路清晰,先DFS看是不是通路,接着就是SPFA找最短路(路是费用,费用相同就比较路的长度)。
超哥的代码还有一点问题,初始化最小费用为0,也能AC,我不信,if语句也好像写错了,只能说明这个题目数据水。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std; #define MAXN 1105
#define MAXM 5005
#define INF 0x3f3f3f3f struct Edge
{
int v,len,fee,next;
Edge() {}
Edge(int vv,int ll,int ff, int nn):v(vv),len(ll),fee(ff),next(nn) {}
} e[*MAXM]; int n,m;
int dept,dest;
int h[MAXN], le;
int minfee[MAXN], minFee[MAXN];
int vis[MAXN];
int d[MAXN], cnt[MAXN]; void add(int u, int v,int w,int fuv,int fvu)
{
e[le] = Edge(v, w, fuv, h[u]);
h[u] = le++;
e[le] = Edge(u, w, fvu, h[v]);
h[v] = le++;
} bool dfs(int x) //判定从x是否可达终点
{
vis[x] = true;
if(x == dest) return true;
if(minfee[x] == INF) return false;
for(int i = h[x]; i != -; i = e[i].next)
{
if(!vis[e[i].v] && minfee[x] == e[i].fee)
{
if(dfs(e[i].v)) return true;
vis[e[i].v] = false;
}
}
return false;
} bool spfa(int x)
{
memset(d,INF,sizeof(d));
memset(vis,false,sizeof(vis));
memset(cnt, , sizeof(cnt));
memset(minFee, INF, sizeof(minFee));
queue<int> q;
q.push(x);
vis[x] = true;
cnt[x] = ;
d[x] = ;
minFee[x] = ;
while(!q.empty())
{
int cur = q.front();
q.pop();
vis[cur] = false;
for(int i = h[cur]; i != -; i = e[i].next)
{
if(minfee[cur] != e[i].fee) continue;
int v = e[i].v, w = e[i].len;
if(minFee[v] > minFee[cur] + minfee[cur] ||(minFee[v] == minFee[cur] + minfee[cur]&&d[v] > d[cur] + w)) //先判断费用更小,再判断距离更小
{
minFee[v] = minFee[cur] + minfee[cur];
d[v] = d[cur] + w;
if(!vis[v])
{
vis[v] = true;
if(++cnt[v] > n) //成环
{
if(dfs(v)) return false; //可达终点
else continue; //不可达终点
}
q.push(v);
}
}
}
}
return true;
} int main()
{ while(~scanf("%d%d%d%d", &n,&m,&dept,&dest))
{
memset(h,-,sizeof(h));
memset(minfee,INF,sizeof(minfee));
le = ;
char cmd[];
int u,v,w,fuv,fvu;
for(int i = ; i < m; i++)
{
scanf("%s",cmd);
sscanf(cmd, "(%d,%d,%d[%d]%d)", &u,&v,&fuv,&w,&fvu);
add(u,v,w,fuv,fvu);
minfee[u] = min(minfee[u], fuv);
minfee[v] = min(minfee[v], fvu);
} memset(vis,false,sizeof(vis));
bool VOID = !dfs(dept);
if(VOID) //没有路径可达
{
printf("VOID\n");
continue;
}
bool UNBOUND = !spfa(dept); //可达路径中存在负权费用环路
if(UNBOUND) printf("UNBOUND\n");
else printf("%d %d\n", minFee[dest], d[dest]);
} return ;
}
Poj(2679),SPFA,二级比较的更多相关文章
- Poj(2679),SPFA,邻接表(主流写法)
题目链接:http://poj.org/problem?id=3268 题意: 有编号为1-N的牛,它们之间存在一些单向的路径.给定一头牛的编号,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求 ...
- POJ 2679:Adventurous Driving(SPFA+DFS)
http://poj.org/problem?id=2679 Adventurous Driving Time Limit: 1000MS Memory Limit: 65536K Total S ...
- poj 2679 Adventurous Driving(SPFA 负环)
/* - - 这题做了一天.....粗心害死人啊 题目描述恶心 数据更恶心... 先处理一下能走的边 能走的点(到这建边从终点跑一下.) 然后就是SPFA了 注意负环的判断 */ #include&l ...
- poj 1511(spfa)
---恢复内容开始--- http://poj.org/problem?id=1511 一个spfa类的模板水题. 题意:就是求从1到n个点的来回的所有距离和. 对spfa类的题还是不太熟练,感觉还是 ...
- poj 3268(spfa)
http://poj.org/problem?id=3268 对于这道题,我想说的就是日了狗了,什么鬼,定义的一个数值的前后顺序不同,一个就TLE,一个就A,还16MS. 感觉人生观都奔溃了,果然,题 ...
- poj 1511(SPFA+邻接表)
题目链接:http://poj.org/problem?id=1511 思路:题目意思很简单就是要求源点到各点的最短路之和,然后再求各点到源点的最短路之和,其实就是建两个图就ok了,其中一个建反图.1 ...
- Invitation Cards POJ 1511 SPFA || dij + heap
http://poj.org/problem?id=1511 求解从1去其他顶点的最短距离之和. 加上其他顶点到1的最短距离之和. 边是单向的. 第一种很容易,直接一个最短路, 然后第二个,需要把边反 ...
- POJ 1511 SPFA+邻接表 Invitation Cards
题目大意: 计算从 1 点 到 其他所有点的 往返距离之和, 因为是 有向图, 所以我们需要将图反存 一次, 然后求两次单源最短路, 结果就出来了. #include <iostream> ...
- poj 3259Wormholes (spfa最短路径)
#include<stdio.h> #include<string.h> #include<limits.h> #include<queue> usin ...
随机推荐
- 使用MJExtension中要注意的地方
MJExtension git地址 https://github.com/CoderMJLee/MJExtension#JSON_Model Model contains model-array[模 ...
- PostgreSQL rule view materialized view examples
warehouse_db=# create table tab_view(emp_id int not null,emp_name varchar(10),emp_city varchar(10)); ...
- Java基础(45):冒泡排序的Java封装(完整可运行)
1.冒泡排序 package lsg.ap.bubble; import java.util.*; public class BubbleSort { public static void bubbl ...
- Java泛型01--任意数组中两元素交换
package com.zl.generic; /** * 交换“任意”数组 中两个元素 */ public class GenericSwapArray { public static void m ...
- 反射认识_06_ArrayList_HashSet区别
包01: package ReflectionCollection; public class ReflectionConstructorPoint { private int x; public i ...
- js 实现精确加减乘除
//加法 function accAdd(arg1, arg2) { var r1, r2, m; try { r1 = arg1.toString().split(".")[1] ...
- SQL数据库之变量
--学习SQL数据库,变量是必须要掌握的概念,系统变量就是变量中最重要的变量之一,下面是SQL中系统变量的应用实例 use AdventureWorksDW exec sp_addtype 'char ...
- Javascript动态加载Html元素到页面Dom文档结构时执行顺序的不同
我们有时会通过ajax动态获取一段Html代码,并且将这段代码通过javascript放到页面的Dom结构中去. 而很多时候通过ajax动态获取的Html代码中也包含javascript代码,有一点需 ...
- EXCEL 删除重复项并保留最大最小值
自定义排序 框选需要主次排序的区域 开始—排序和筛选—自定义排序 添加筛选条件 若要获取最小值则次要关键字选择升序 排序后的数据 删除重复项 数据—删除重复项 选择要删除的列 删除A列的重复项后,B列 ...
- dota玩家与英雄契合度的计算器,python语言scrapy爬虫的使用
首发:个人博客,更新&纠错&回复 演示地址在这里,代码在这里. 一个dota玩家与英雄契合度的计算器(查看效果),包括两部分代码: 1.python的scrapy爬虫,总体思路是pag ...