【算法渣渣的逆袭之路】今天的题竟然有图!!

今天的题竟然有图!!我还没看过这个部分!!离散上课没听讲过有木有!!!

下面贴出今天学的单源最短路,只能现学现卖了!!!

单源最短路问题是固定一个起点,求它到其他所有点的最短路问题,也包括终点也固定的问题

1-Bellman-Ford算法

//单源最短路算法(BELLMAN-FORD算法) 

struct edge{int from,to,cost};   //从顶点from指向顶点TO的权值为cost的边 

edge es[MAX_E];  //边 

int d[MAX_v]; //最短距离 

int V,E;    //V是顶点数,E是边数 

//求解从顶点s出发到所有点的最短距离

void shortest_path(int s)
{
    for(int i=0;i<V;i++)  d[i]=INF;
    d[s]=0;
    while(true)
    {
        bool update=false;
        for(int i=0;i<E;i++)
        {
            edge e=es[i];
            if(d[e.from]!=INF&&d[e.to]>d[e.from]+e.cost)
            {
                d[e.to]=d[e.from]+e.cost;
                update=true;
            }
        }
    if(!update) break; 
    }   
} 

//如果返回true则存在负圈
bool find_negative_loop()
{
memset(d,0,sizeof(d));

for(int i=0;i<V;i++)
for(int j=0;j<E;j++)
{
    edge e=es[j];
    if(d[e.to]>d[e.from]+e.cost)
    {
        d[e.to]=d[e.from]+e.cost;
        //如果第n次仍然更新了,则存在负圈 
        if(i==V-1) return true; 
    }
}   
return false;
} 

写完瞬间感觉很蛋疼有木有!

2-Dijlstra算法(wufajiejue 无法解决图中存在负边的问题)

(1)找到最短距离已经确定的顶点,从它出发更新相邻顶点的最短距离。
(2)此后不需要再关心1中的“最短距离已经确定的顶点”

int cost[MAX_V][MAX_V];  //csot[u][v]表示边e=(u,v)的权值(不存在这条边时设为INF) 
int d[MAX_V];           //顶点s出发的最短距离 
bool used[MAX_V];       //已经使用过的图 
int V;                  //顶点数
//求从起点s到各个顶点的最短距离 
void dijkstra(int s)
{
    fill(d,d+V,INF);
    fill(used,used+V,false)
    d[s]=0;

    while(true)
    {
        int v=-1;
//从尚未使用过的顶点中选择一个距离最小的顶点 
        for(int u=0;u<V;u++)
        {
            if(!used[u]&&(v==-1||d[u<d[v]]))
            v=u;
        }
        if(v==-1)break;
        used[v]=true;

        for(int u=0;u<V;u++)
        {d[u]=min(d[u],d[V]+cost[v][u]);} 
    }
} 

先更到这里吧,暑假的目标是先把搜索,dp,图论搞搞。。

你可能感兴趣的:(图,顶点)