1. 程式人生 > >REcheck 圖論基礎算法

REcheck 圖論基礎算法

訪問 == 表示 code pat 距離 基礎算法 () ext

真是搞懂了

聲明:

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 圖論基礎算法