zoukankan      html  css  js  c++  java
  • hdu1869六度分离,spfa实现求最短路

    就是给一个图。假设随意两点之间的距离都不超过7则输出Yes,否则

    输出No。



    因为之前没写过spfa,无聊的试了一下。

    大概说下我对spfa实现的理解。

    因为它是bellmanford的优化。
    所以之前会bf的理解起来,可能会比較easy。

    它是这样子的,你弄一个队列。

    先打一个起点进去。之后求出的到各点的最短路。

    都是由这个点出发的。



    然后開始迭代,直至队列为空。

    在迭代的过程中,

    首先从队列里面拿一个点出来,

    然后标记一下,说明这个点不在队列里面。

    然后開始枚举全部点。进行松弛化,

    松弛化的过程就是看以这个拿出来的点为转折点,

    枚举的其他点为终点,看有没有更好的方法

    让路径变短。

    假设有的话,推断那个点在不在队列中。

    假设不在。

    就把枚举出的那个点。拿到

    队列中去。记得标记一下说明这个点已经在队列中了。



    就是这样了。

    代码例如以下:

    #include<iostream>
    #include<cstring>
    #include<queue>
    using namespace std;
    int num_dot,num_side,iq[110],weight[110],dis[110][110];
    void init()
    {
    	int i,t1,t2;
    	memset(dis,127,sizeof(dis));	
    	for(i=0;i<num_side;i++)
    	{
    		scanf("%d%d",&t1,&t2);
    		dis[t1][t2]=1;
    		dis[t2][t1]=1;
    	}
    }
    void spfa(int st)
    {
    	int x,i;
    	queue<int>qq;
    	memset(iq,0,sizeof(iq));
    	memset(weight,127,sizeof(weight));
    	iq[st]=1;
    	qq.push(st);
    	weight[st]=0;
    	while(qq.size())
    	{
    		x=qq.front();
    		qq.pop();
    		iq[x]=0;
    		for(i=0;i<num_dot;i++)
    			if(weight[i]>weight[x]+dis[x][i])
    			{
    				weight[i]=weight[x]+dis[x][i];
    				if(!iq[i])
    				{
    					qq.push(i);
    					iq[i]=1;
    				}
    			}
    	}
    }
    bool isright()
    {
    	int i,j;
    	for(i=0;i<num_dot;i++)
    	{
    		spfa(i);
    		for(j=i+1;j<num_dot;j++)
    			if(weight[j]>7)
    				return 0;
    	}
    	return 1;
    }
    int main()
    {
    	while(scanf("%d%d",&num_dot,&num_side)!=EOF)
    	{init();
    	if(isright())
    		printf("Yes
    ");
    	else
    		printf("No
    ");}
    }


  • 相关阅读:
    第三次作业
    第二次作业
    10.30 非确定的自动机NFA确定化为DFA
    10.23 正规式、正规文法与自动机
    10.16 正规文法与正规式
    10.9 词法分析程序的设计与实现
    9.25 文法和语言总结与梳理
    9.18 语法树,短语,直接短语,句柄
    9.11 理解文法和语言
    9.4 了解编译原理
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5057286.html
Copyright © 2011-2022 走看看