spfa DFS和BFS的spfa复杂度证明各为多少?(n为点数E为边数),有没有DFS比BFS更优秀的情况?

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
HDU 3313 Key Vertex(dfs + bfs)
摘要:HDU3313KeyVertex题目链接题意:一个有向无环图,求s,t之间的割点思路:先spfa找一条最短路出来,如果不存在,就n个都是割点。然后每次从s进行dfs,找到能经过最短路上的最远点,然后这个点就是割点,然后下次在以这个为起点dfs,不断迭代直到找到t为止代码:#include#include#include#include#inclconstintN=100005;intn,m,s,t,fa[N],vis[N],mark[
HDU 3313 Key Vertex
题意:一个有向无环图,求s,t之间的割点
思路:先spfa找一条最短路出来,如果不存在,就n个都是割点。然后每次从s进行dfs,找到能经过最短路上的最远点,然后这个点就是割点,然后下次在以这个为起点dfs,不断迭代直到找到t为止
#includeconst int N = 100005;int n, m, s, t, fa[N], vis[N], mark[N], d[N];int first[N], vv[N * 3], next[N * 3],const int INF = 0x3f3f3f3f;void addedge(int a, int b) { vv[en] = next[en] = first[a]; first[a] = en++;}bool bfs() { queue
Q; for (int i = 0; i & i++) d[i] = INF; memset(vis, 0, sizeof(vis)); Q.push(s); vis[s] = 1; d[s] = 0; while (!Q.empty()) {
int u = Q.front();
vis[u] = 0;
for (int i = first[u]; i + 1; i = next[i]) {
int v = vv[i];
if (d[v] & d[u] + 1) {
d[v] = d[u] + 1;
if (!vis[v]) {
Q.push(v);
vis[v] = 1;
} } if (d[t] &= INF) int tmp = memset(mark, 0, sizeof(mark)); while (tmp != s) {
mark[tmp] = 1;
tmp = fa[tmp]; } mark[s] = mark[t] = 1; }void dfs(int u) { for (int i = first[u]; i + 1; i = next[i]) {
int v = vv[i];
if (vis[v])
vis[v] = 1;
if (mark[v]) {
if (d[v] & d[s])
dfs(v); }}int main() { while (~scanf(&%d%d&, &;n, &;m)) {
memset(first, -1, sizeof(first));
while (m--) {
scanf(&%d%d&, &;u, &;v);
addedge(u, v);
scanf(&%d%d&, &;s, &;t);
if (!bfs()) {
printf(&%d/n&, n);
int ans = 1;
memset(vis, 0, sizeof(vis));
while (s != t) {
printf(&%d/n&, ans); } return 0;}
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
HDU 3313 Key Vertex(dfs + bfs)相关信息,包括
的信息,所有HDU 3313 Key Vertex(dfs + bfs)相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International为什么用BFS求出来的是最短路_百度知道
为什么用BFS求出来的是最短路
如题 为什么每步所花费的代价一样可以用BFS 不一样就不可以用BFS
我有更好的答案
BFS是广度搜索,这意味从当前点出发,都会到达与它链接的点,你可以想象一下,这样的搜索,是不是很有层次感,是一层层地,如果代价一样的话,相当是求层次最少的,如果代价不一样的话,这里的层次就没有意义了。
采纳率:57%
BFS即宽度优先搜索。从出发点开始,第一次遍历到终点时过的那条路径就是最短的路径。因为这条路径没有多绕一个不相关节点啊,所以它是最短的。
BFS在树的遍历中又称作层次遍历(设树的根结点所在层为第0层,从根结点开始依次遍历第1层、第2层、.......、第n层),在从每层到下一层所花费的代价(即问题中所说的每一步的代价)一样的情况下,所花费的总代价和所经过的层数成正比关系,所经过的层数多少(即走过多少步)即可象征所花费的总代价的多少。又由于BFS遍历是由低层到高层的顺序遍历,所以在每一层到下一层所花费代价相同时,即为一种从低花费到高花费的遍历,所以在这种情况下可以用BFS求最短路。若从每一层到下一层所花费的代价不同,则不能用所经过层数的多少象征所花费的总代价,这时就不能用BFS求最短路。图的话同理。在每步代价不同时,若求单源最短路可用Dijkstra(适用于不含负权的图)、SPFA(可处理有负权边的图(但不能有负权回路)),若要求任意两点间的最短路可用Floyd算法
1条折叠回答
为您推荐:
其他类似问题
短路的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。SPFA算法的优化及应用_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
SPFA算法的优化及应用
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩34页未读,
定制HR最喜欢的简历
你可能喜欢【tyvj1520】树的直径【树形DP】【DFS】【BFS】【SPFA】
树的直径,即这棵树中距离最远的两个结点的距离。每两个相邻的结点的距离为1,即父亲结点与儿子结点或儿子结点与父子结点之间的距离为1.有趣的是,从树的任意一个结点a出发,走到距离最远的结点b,再从结点b出发,能够走的最远距离,就是树的直径。树中相邻两个结点的距离为1。你的任务是:给定一棵树,求这棵树中距离最远的两个结点的距离。
第一行是一个正整数n,表示这棵树的结点数
接下来的n-1行,每行三个正整数a,b,w。表示结点a和结点b之间有一条边,长度为w
数据保证一定是一棵树,不必判错。
输出共一行
第一行仅一个数,表示这棵树的最远距离
f[x] 表示与当前点相连的所以路径中的最长路
g[x]表示与当前点相连的所以路径中的次长路
当前点对答案的贡献就是最长路+次长路
#define N 100000
int next[N],point[N],v[N],c[N],ans,
int f[N],g[N];
void add(int x,int y,int z)
&tot++; next[tot]=point[x]; point[x]= v[tot]=y; c[tot]=z;
&tot++; next[tot]=point[y]; point[y]= v[tot]=x; c[tot]=z;
int dp(int x,int fa)
&g[x]=0; f[x]=0;
&for (int i=point[x];i;i=next[i])
& if (v[i]!=fa)
&& &int t=c[i]+dp(v[i],x);
&& &if (t&f[x])
&& & g[x]=f[x],f[x]=t;
&& & if (t&g[x])
&& && g[x]=t;
&ans=max(ans,f[x]+g[x]);
&return f[x];
int main()
&scanf("%d",&n);
&for (int i=1;i
& &int x,y,z; scanf("%d%d%d",&x,&y,&z);
& &add(x,y,z);
&printf("%d\n",ans);
using namespace std;
max_n=1e4+5;
max_e=max_n*2;
int n,x,y,z,ans,
tot,point[max_n],next[max_e],v[max_e],c[max_e];
inline void add(int
x,int y,int
z){++next[tot]=point[x];point[x]=v[tot]=y;c[tot]=z;}
inline void dfs(int
x,int fa,int dis){
if (dis&ans) ans=dis,ansp=x;
for (int i=point[x];i;i=next[i])
if (v[i]!=fa)
dfs(v[i],x,dis+c[i]);
inline void get_ans(int
x,int fa,int dis){
if (dis&ans) ans=dis,ansp=x;
for (int i=point[x];i;i=next[i])
if (v[i]!=fa)
get_ans(v[i],x,dis+c[i]);
int main(){
scanf("%d",&n);
i=1;iscanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z);
ans=0,ansp=1;
dfs(1,0,0);
get_ans(ansp,0,0);
printf("%d\n",ans);
//qscqesze
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 200001
#define mod 10007
#define eps 1e-9
//const int inf=0x7&&
const int inf=0x3f3f3f3f;
//**************************************************************************************
inline ll read()
x=0,f=1;char ch=getchar();
while(ch&'0'||ch&'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch&='0'&&ch&='9'){x=x*10+ch-'0';ch=getchar();}
&&& return
struct edge
struct node
vector kiss[maxn];
void add_edge(int a,int b,int c)
kiss[a].push_back((edge){b,c});
kiss[b].push_back((edge){a,c});
int vis[maxn];
int dis[maxn];
int main()
&&& for(int
int a,b,c;
a=read(),b=read(),c=read();
add_edge(a,b,c);
q.push(1);
&&& for(int
i=1;i&=n;i++)
memset(vis,0,sizeof(vis));
while(!q.empty())
int now=q.front();
vis[now]=0;
for(int i=0;i
&&&&&&&&&&&
int next=kiss[now][i].x;
&&&&&&&&&&&
//cout&&dis[now]+kiss[now][i].y&&"
"&&dis[next]&&
&&&&&&&&&&&
if(dis[now]+kiss[now][i].y
&&&&&&&&&&&
&&&&&&&&&&&&&&&
dis[next]=dis[now]+kiss[now][i].y;
&&&&&&&&&&&&&&&
if(vis[next]==0)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
vis[next]=1;
&&&&&&&&&&&&&&&&&&&
q.push(next);
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&& for(int
i=1;i&=n;i++)
if(dis[i]!=inf&&dis[i]&ans1)
&&&&&&&&&&&
&&&&&&&&&&&
ans1=dis[i];
&&& for(int
i=1;i&=n;i++)
dis[ans]=0;
memset(vis,0,sizeof(vis));
q.push(ans);
vis[ans]=1;
&&& ans=0;
while(!q.empty())
int now=q.front();
vis[now]=0;
for(int i=0;i
&&&&&&&&&&&
int next=kiss[now][i].x;
&&&&&&&&&&&
if(dis[now]+kiss[now][i].y
&&&&&&&&&&&
&&&&&&&&&&&&&&&
dis[next]=dis[now]+kiss[now][i].y;
&&&&&&&&&&&&&&&
if(vis[next]==0)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
vis[next]=1;
&&&&&&&&&&&&&&&&&&&
q.push(next);
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&& for(int
i=1;i&=n;i++)
if(dis[i]!=inf)
&&&&&&&&&&&
ans1=max(ans1,dis[i]);
cout&&ans1&&
#define ll long long
x=0,f=1;char ch=getchar();
while(ch&'0'||ch&'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch&='0'&&ch&='9'){x=x*10+ch-'0';ch=getchar();}
&&& return
int q[100005],d[100005];
vectore[100005],len[100005];
char ch[5];
void bfs(int x)
&int head=0,tail=1;
&memset(d,0,sizeof(d));
&while(head!=tail)
&&int now=q[head];head++;
&&if(d[now]&d[X])X=
&&for(int i=0;i
&&&if(!d[e[now][i]]&&e[now][i]!=x)
&&&&d[e[now][i]]=d[now]+len[now][i];
&&&&q[tail++]=e[now][i];
int main()
&n=read();
&for(int i=1;i
u=read(),v=read(),w=read();
&&e[u].push_back(v);
&&len[u].push_back(w);
&&e[v].push_back(u);
&&len[v].push_back(w);
&printf("%d\n",d[X]);
&return 0;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。没有更多推荐了,
不良信息举报
举报内容:
各算法时间复杂度总结
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 数组和链表时间复杂度 的文章

 

随机推荐