码迷,mamicode.com
首页 > 编程语言 > 详细

REcheck 图论基础算法

时间:2017-11-04 11:20:20      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:path   --   class   最短路径   jks   size   col   mem   log   

真是搞懂了

声明:

struct edge
{
    int y,v,next;
}e[maxn+100];
int link[maxn+100];
int len=0;
void push(int xx,int yy,int vv){    e[++len].next=link[xx]; link[xx]=len;e[len].v=vv;e[len].y=yy;}

int main()
{
    F(i,1,n)
    {
        scanf("%d%d%d",&xx,&yy,&zz);
        push(xx,yy,zz);
        push(yy,xx,zz);
    }
}

传包:

void floyed()
{
    F(k,1,n)
        F(i,1,n)
            F(j,1,n)
                if(dis[i][k]+dis[k][j]<dis[i][j])//如果有一点k,使i-->k加上k-->j的路径比i-->j短则更新i~j的路径为更短的,并记录到path内
                    dis[i][j]=dis[i][k]+dis[k][j],path[i][j]=k;
}

单源非负最短路径:

void dijkstra(int st)
{
    F(i,1,n)
        dis[i]=a[st][i];
    memset(vis,0,sizeof(vis));
    vis[st]=1;dis[st]=0;
    F(i,1,n-1)
    {
        int maxn=INF;
        int k=0;
        F(j,1,n)
        {
            if((!vis[j])&&(dis[j]<maxn))
            {
                maxn=dis[j];
                k=j;
            }
        }
        if(k==0) return;
        vis[k]=1;
        F(j,1,n)//由于外层是i循环,k又被dis(表示st到dis[n]的距离)代替所以只用一层循环即可用floyed进行点的更新
        {
            if(!vis[j]&&[k]+a[k][j]<dis[j])//如果到原点的最近点k加上k到j(1~n)比st到j距离还近(且未访问)的话则更新路径到更短的;
                dis[j]=dis[k]+a[k][j];
        }
    }
}

 

REcheck 图论基础算法

标签:path   --   class   最短路径   jks   size   col   mem   log   

原文地址:http://www.cnblogs.com/Murs/p/7781123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!