圖論

1.floyed求環

int n;
int ans;
ll a[maxn];
ll g[maxm][maxm],dist[maxm][maxm];

int main()
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            g[i][j]=inf;

    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            if((a[i]&a[j])!=0)
                g[i][j]=g[j][i]=1;

    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) 
            dist[i][j]=g[i][j];
 
    ll ans=inf;
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=k-1;i++)
            for(int j=i+1;j<=k-1;j++)
                ans=min(dist[i][j]+g[i][k]+g[k][j],ans);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
    }
 
    if(ans>=1000)printf("-1\n");
    else printf("%lld\n",ans);

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章