两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路。


POJ3268-Silver Cow Party

//计算正逆最短路径之和的最大值
//Time:32Ms Memory:360K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std; #define MAX 1005
#define MAXE 100005
#define INF 0x3f3f3f3f struct Edge {
int v, w, next;
Edge() {}
Edge(int vv, int ww, int nn):v(vv), w(ww), next(nn) {}
}e[2][MAXE]; int n, m, x;
int h[2][MAX], d[2][MAX];
bool v[MAX]; void spfa(int x, int r)
{
memset(v, false, sizeof(v));
queue<int> q;
q.push(x); d[r][x] = 0;
while (!q.empty()){
int cur = q.front();
q.pop(); v[cur] = false;
for (int i = h[r][cur]; i != -1; i = e[r][i].next)
{
int tv = e[r][i].v;
int tw = e[r][i].w;
if (d[r][tv] > d[r][cur] + tw) {
d[r][tv] = d[r][cur] + tw;
if (!v[tv]) {
q.push(tv); v[tv] = true;
}
}
}
}
} int main()
{
memset(d, INF, sizeof(d));
memset(h, -1, sizeof(h));
scanf("%d%d%d", &n, &m, &x);
for (int i = 0; i < m; i++)
{
int a, b, t;
scanf("%d%d%d", &a, &b, &t);
if (a == b) {
m--; i--; continue;
}
e[0][i] = Edge(b, t, h[0][a]); //正向
e[1][i] = Edge(a, t, h[1][b]); //反向
h[0][a] = h[1][b] = i;
} spfa(x, 0); //正向路径找返回最短路
spfa(x, 1); //反向路径找出发最短路
int Max = 0;
for (int i = 1; i <= n; i++)
Max = max(d[0][i] + d[1][i], Max);
printf("%d\n", Max);
return 0;
}

POJ3259-Wormholes

//SPFA或Bellman Ford算法
//判断是否有负权值回路
//Time:172Ms Memory:252K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std; #define MAX 505
#define MAXN 5500
#define INF 0x3f3f3f3f struct Edge {
int u, w, next;
Edge() {}
Edge(int uu, int ww, int nn) :u(uu), w(ww), next(nn) {}
}e[MAXN]; int n, m, w;
int le;
int h[MAX], d[MAX];
int cnt[MAX];
bool v[MAX]; bool spfa(int x)
{
memset(cnt, 0, sizeof(cnt));
memset(v, false, sizeof(v));
memset(d, INF, sizeof(d));
d[x] = 0;
queue<int> q;
q.push(x); cnt[x] = 1;
while (!q.empty()) {
int cur = q.front();
q.pop(); v[cur] = false;
for (int i = h[cur]; i != -1; i = e[i].next)
{
int u = e[i].u, w = e[i].w;
if (d[u] > d[cur] + w)
{
d[u] = d[cur] + w;
if (!v[u]) {
v[u] = true; q.push(u);
//如果某点入队列达到n次,则一定存在负权值回路
if (++cnt[u] == n) return true;
}
}
}
}
return false;
} int main()
{
int T;
scanf("%d", &T);
while (T--)
{
le = 0;
memset(h, -1, sizeof(h));
scanf("%d%d%d", &n, &m, &w);
int a, b, t;
while (m--) {
scanf("%d%d%d", &a, &b, &t);
e[le] = Edge(b, t, h[a]); h[a] = le++;
e[le] = Edge(a, t, h[b]); h[b] = le++;
}
while (w--) {
scanf("%d%d%d", &a, &b, &t);
e[le] = Edge(b, -t, h[a]); h[a] = le++;
}
/*如果不是连通图则需要遍历所有点 //Time:1750Ms
int flag = false;
for (int i = 1; i <= n; i++)
if (spfa(i)) {
flag = true; break;
}
题目未说清是否为连通图
*/
if (spfa(1)) printf("YES\n");
else printf("NO\n"); }
return 0;
}

ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)的更多相关文章

  1. ACM/ICPC 之 Floyd范例两道(POJ2570-POJ2263)

    两道以Floyd算法为解法的范例,第二题如果数据量较大,须采用其他解法 POJ2570-Fiber Network //经典的传递闭包问题,由于只有26个公司可以采用二进制存储 //Time:141M ...

  2. ACM/ICPC 之 SPFA练习两道(ZOJ3088-ZOJ3103)

    两道题都需要进行双向SPFA,比范例复杂,代码也较长,其中第二题应该可以用DFS或者BFS做,如果用DFS可能需要的剪枝较多. ZOJ3088-Easter Holydays //利用SPFA找出下降 ...

  3. ACM/ICPC 之 差分约束系统两道(ZOJ2770-POJ1201)

    当对问题建立数学模型后,发现其是一个差分方程组,那么问题可以转换为最短路问题,一下分别选用Bellmanford-SPFA解题 ZOJ2770-Burn the Linked Camp //差分约束方 ...

  4. ACM/ICPC 之 Prim范例(ZOJ1586-POJ1789(ZOJ2158))

    两道Prim解法范例题型,简单的裸Prim,且两题相较以边为重心的Kruskal解法而言更适合以点为重心扩展的Prim解法. ZOJ1586-QS Network 题意:见Code 题解:直接的MST ...

  5. ACM/ICPC 之 Kruskal范例(ZOJ1203-POJ1861(ZOJ1542))

    两道最小生成树范例,Kruskal解法-以边为主体扩展最小生成树,需要利用并查集. ZOJ1203-Swordfish 题意:求n个给定平面坐标的城市中的一条平面距离上的最短路长(保留两位小数) 题解 ...

  6. 『ACM C++』Virtual Judge | 两道基础题 - The Architect Omar && Malek and Summer Semester

    这几天一直在宿舍跑PY模型,学校的ACM寒假集训我也没去成,来学校的时候已经18号了,突然加进去也就上一天然后排位赛了,没学什么就去打怕是要被虐成渣,今天开学前一天,看到最后有一场大的排位赛,就上去试 ...

  7. ACM/ICPC 之 BFS范例(ZOJ2913-ZOJ1136(POJ1465))

    通过几道经典BFS例题阐述BFS思路 ZOJ2913-Bus Pass 题意:找一个center区域,使得center到所有公交线路最短,有等距的center则输出id最小的. 题解:经典的BFS,由 ...

  8. ACM/ICPC 之 DFS范例(ZOJ2412-ZOJ1008)

    通过几道例题简单阐述一下DFS的相关题型 ZOJ2412-Farm Irrigation 直观的DFS题型,稍加变化,记录好四个方向上的通路就能够做出来 题目和接水管类似,问最少要灌溉几次,即求解最少 ...

  9. ACM/ICPC 之 欧拉回路两道(POJ1300-POJ1386)

    两道有关欧拉回路的例题 POJ1300-Door Man //判定是否存在从某点到0点的欧拉回路 //Time:0Ms Memory:116K #include<iostream> #in ...

随机推荐

  1. 【转】Flume(NG)架构设计要点及配置实践

    Flume(NG)架构设计要点及配置实践   Flume NG是一个分布式.可靠.可用的系统,它能够将不同数据源的海量日志数据进行高效收集.聚合.移动,最后存储到一个中心化数据存储系统中.由原来的Fl ...

  2. 【10-25】OOP基础-飞机游戏知识点

    知识点 鼠标适配器类为抽象类,使用匿名子类实现鼠标事件的重写,创建一个鼠标适配器对象 添加鼠标事件监听器到JPanel对象实现鼠标的响应 创建定时器Timer对象,在定时器的任务列表方法schedul ...

  3. ajava包的命名

    2. Package的命名 Package名的第一部分应是小写ASCII字符,并且是顶级域名之一,通常是com.edu.gov.mil.net.org或由ISO标准3166.1981定义的国家唯一标志 ...

  4. html css 网络 页面布局 颜色 参考 拾取器网址

    http://blog.163.com/wujinhongisme@126/blog/static/3613698020095115919389/ ========================== ...

  5. hdu4950 Monster (水题)

    4950 Monster Monster Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...

  6. 优化 PHP 代码建议

    1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍.2.$row[’id’] 的速度是$row[id]的7倍.3.echo 比 print 快,并且使用echo的 ...

  7. 关于360的META设置,强制使用极速模式

    我的网站,为了使360浏览器打开时默认为极速模式,给用户良好的体验!避免网页由于细节而导致页面布局错乱~ <!DOCTYPE HTML> <html> <head> ...

  8. OFFICE文档(DOC,XLS,PPT)打开报错的解决办法!

    一般情况下,打开OFFICE文档报错都是因为模板文件出错!! 至于为什么会出错这个问题不好说,可能是不正确关闭文档等等,重装OFFICE也不一定能解决问题! 出现这种情况一般是所有的Word文档或者E ...

  9. Unix时间戳转换怎样在Excel批量修改?

    最近在操作项目的时候碰到一个Unix时间戳转换的问题."date_time":1393031347这个是什么,你知道吗?如果你对Unix时间戳了解的话一眼就看出来.但我们本着科普的 ...

  10. 校友聊NABCD

    特点之一     界面简洁 N:软件的界面是软件成功的必要条件,界面简洁,用户使用方便,就会吸引用户. A:界面可用多种做法做,暂定用C# B:简洁的界面,用户易于理解各项功能,方便使用. C:没有其 ...