lightoj 1074
这题怎么说呢,负环上的点都不行
网上也有很多解法
我用dfs的spfa解的
我发现网上别人的代码都是用bfs的spfa写的,我就用的dfs的,快了好多

代码还看的别人的,只有中间的spfa是自己写的
我自己原来写的不知道为什么就过不了
把别人的spfa换成自己的就过了
这个是ac的:
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std; const int N = ;
const int MAX = 0x3f3f3f3f;
int dis[N];
int p[N];
int h[N];
int cnt[N];
bool vis[N];
bool r[N];
int c[N]; struct Node
{
int u, v, w, next;
}e[N*N]; void dfs(int x)
{
r[x] = ;
for(int i=h[x]; i!=-; i=e[i].next)
if(!r[e[i].v])
dfs(e[i].v);
} void spfa(int u)
{
if(r[u])
return ;
vis[u] = true;
for(int i = h[u]; i != -; i = e[i].next)
{
int v,w;
v = e[i].v;
w = e[i].w;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u]+w;
if(vis[v])
{
dfs(v);
return ;
}
else
{
spfa(v);
}
}
}
vis[u] = false;
} int main()
{
int T;
scanf("%d", &T);
for(int tt=; tt<=T; tt++)
{
int n, m;
scanf("%d", &n);
memset(cnt, , sizeof(cnt));
memset(vis, , sizeof(vis));
memset(r, , sizeof(r));
memset(dis, 0x3f3f3f3f, sizeof(dis));
for(int i=; i<=n; i++)
scanf("%d", &p[i]);
scanf("%d", &m);
memset(h, -, sizeof(h));
for(int i=; i<m; i++)
{
int a, b;
scanf("%d%d", &a, &b);
e[i].u = a;
e[i].v = b;
e[i].w = (p[b]-p[a])*(p[b]-p[a])*(p[b]-p[a]);
e[i].next = h[a];
h[a] = i;
}
int Q;
scanf("%d", &Q);
for(int i=; i<Q; i++)
scanf("%d", &c[i]);
printf("Case %d:\n", tt); dis[] = ;
spfa();
for(int i=; i<Q; i++)
{
int to = c[i];
if(dis[to]==MAX || r[to] || dis[to] < )
printf("?\n");
else
printf("%d\n", dis[to]);
}
}
return ;
}
这个是wa的,那位dalao帮我抓抓虫啊,真的苦,我看了半天楞是没看出来
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = ;
const int INF = 0x3f3f3f3f;
int n,m;
int cnt;
struct node
{
int v,w;
};
bool vis[maxn];
int head[maxn];
int nex[maxn];
node e[maxn*maxn];
int dis[maxn];
int busy[maxn];
bool vis2[maxn];
int c[maxn];
void adde(int u,int v,int w)
{
node t;
t.v = v;
t.w = w;
e[cnt] = t;
nex[cnt] = head[u];
head[u] = cnt ++;
}
void spfa(int u);
void dfs(int u);
int main()
{
int t;
scanf("%d",&t);
for(int k = ; k <= t; ++k)
{
memset(vis2,,sizeof(vis2));
memset(dis,0x3f,sizeof(dis));
memset(vis,,sizeof(vis));
memset(head,-,sizeof(head));
//memset(cn,0,sizeof(cn));
memset(nex,-,sizeof(nex));
memset(e,,sizeof(e));
cnt = ;
scanf("%d",&n);
for(int i = ; i <= n; ++i)
scanf("%d",busy+i); scanf("%d",&m);
for(int i = ; i < m; ++i)
{
int a,b;
scanf("%d%d",&a,&b);
int c = (busy[b] - busy[a])*(busy[b] - busy[a])*(busy[b] - busy[a]);
adde(a,b,c);
}
int Q;
scanf("%d",&Q);
for(int i = ; i < Q; ++i)
scanf("%d",c+i); printf("Case %d:\n", k);
dis[] = ;
spfa();
for(int i = ; i < Q; ++i)
{
if(dis[c[i]] == INF || vis2[c[i]] || dis[c[i]] < )
printf("?\n");
else
printf("%d\n",dis[c[i]]);
}
}
return ;
}
void spfa(int u)
{
if(vis2[u])
return ;
vis[u] = true;
for(int i = head[u]; i != -; i = nex[i])
{
int v,w;
v = e[i].v;
w = e[i].w;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u]+w;
if(vis[v])
{
dfs(v);
return ;
}
else
{
spfa(v);
}
}
}
vis[u] = false;
}
void dfs(int u)
{
vis2[u] = true;
for(int i = head[u]; i != -; i = nex[i])
{
int v = e[i].v;
if(vis2[v] == false)
dfs(v);
}
}
lightoj 1074的更多相关文章
- lightoj 1074 spfa判断负环
Extended Traffic Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Sub ...
- LightOJ 1074 - Extended Traffic (SPFA)
http://lightoj.com/volume_showproblem.php?problem=1074 1074 - Extended Traffic PDF (English) Stati ...
- LightOj 1074 Extended Traffic (spfa+负权环)
题目链接: http://lightoj.com/volume_showproblem.php?problem=1074 题目大意: 有一个大城市有n个十字交叉口,有m条路,城市十分拥挤,因此每一个路 ...
- lightoj 1074 - Extended Traffic(spfa+负环判断)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1074 题意:有n个城市,每一个城市有一个拥挤度ai,从一个城市I到另一个城市J ...
- SPFA(负环) LightOJ 1074 Extended Traffic
题目传送门 题意:收过路费.如果最后的收费小于3或不能达到,输出'?'.否则输出到n点最小的过路费 分析:关键权值可为负,如果碰到负环是,小于3的约束条件不够,那么在得知有负环时,把这个环的点都标记下 ...
- kuangbin_ShortPath O (LightOJ 1074)
这是什么鬼OJ啊都没见过害的我还交错语言CE了一发摔 想着懒得重写了直接把上一题的dij改了改就交了 然后RE 反应过来这题有负环 想着怎么标记负环同时不直接结束spfa 看了别人的代码感叹了一下我还 ...
- LightOJ 1074 Extended Traffic (最短路spfa+标记负环点)
Extended Traffic 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/O Description Dhaka city ...
- LightOJ 1074 Extended Traffic SPFA 消负环
分析:一看就是求最短路,然后用dij,果断错了一发,发现是3次方,有可能会出现负环 然后用spfa判负环,然后标记负环所有可达的点,被标记的点答案都是“?” #include<cstdio> ...
- (简单) LightOJ 1074 Extended Traffic,SPFA+负环。
Description Dhaka city is getting crowded and noisy day by day. Certain roads always remain blocked ...
随机推荐
- redis缓存与数据库一致性问题
一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去. ...
- netcore发布到 iis 设置 部署 环境 变量
原文链接:https://www.cnblogs.com/Ambre/p/9646445.html 打开IIS,选择本机,找到管理-配置编辑器 1:打开IIS,选择本机,找到管理-配置编辑器 2.节选 ...
- 爬坑记-tomcat 项目启动两次的的解决
项目就启动了两次,程序倒是正常运行,关键我里边写了个while 循环,不能让它启动两次啊 百度了一下,有人说是tomcat server.xml或者tomcat新建服务的时候设置出了问题 ....最终 ...
- oracle 数据库去重复数据
delete from 表名 a where rowid !=(select max(rowid) from 表名 b where a.ORDER_ID=b.ORDER_ID) 例:如果重复的数据表是 ...
- CSS定位网页中的元素
relative相对定位 偏移设置:left.right.top.bottom 值单位:px 元素的规律: 相对定位元素的规律 设置相对定位的盒子会相对它原来的位置通过指定偏移,到达新的位置. 设置相 ...
- 杨其菊201771010134《面向对象程序设计(java)》第十四周学习总结
第十四周学习总结 第一部分:理论知识 理论知识:本周学习Swing用户界面 内容:Swing与模型-视图-控制器设计模式:布局管理概述:文本输入 :选择组件:菜单:复杂的布局管理:对话框: 第二部分: ...
- mysql导出导入数据
使用sql语句导出数据: 导出时如果不写绝对路径,会提示The MySQL server is running with the --secure-file-priv option so it can ...
- SpringBoot处理日期转换问题
前台传一个datetime类型的数据即yyyy-MM-dd HH:mm:ss格式的数据黑后台controller,结果发现接收到的对象为yyyy-MM-dd 00:00:00,处理这个问题可以在con ...
- 格式代码出现两次oracle
报ORA-01810:格式代码出现两次 原因是Java中的年月日和Oracle中的年月日表示形式不一样 oracle用MI来代表分钟,而不是java中的mm
- 关于Visual Studio调试C/C++,JS,PHP,JAVA,Python等语言的方法
我在开始接触vs code后,确实对它的高颜值和小巧灵活而着迷,但是有一个非常现实的问题,相对于vs来说,vscode是一个代码编辑器,而不是一个IDE,在代码编译运行上存在着极大的问题,尤其是开始编 ...