首页 > 编程语言 > 详细

REcheck 图论基础算法

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

真是搞懂了

声明:

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 图论基础算法

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!