1 条题解

  • 0
    @ 2019-01-01 15:18:06

    要找出无向图的最小环。我用了比较差的算法:
    对于两个有边连接的点,删掉它们之间的边之后两点的最短距离,与两点之间边的距离之和,有可能是最小环的周长。
    枚举每一对有边连接的点,先把连接边的长度设为无穷大,再求两点的最短路,用得到的答案更新最终答案。
    实际上有更好的算法。请搜索无向图最小环。

    #include<iostream>
    #include<string.h>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    const int MAXN=100,MAXM=200,INF=(1<<20);
    queue<int> q;
    int N,M,ans=INF;
    int dist[MAXN+1][MAXN+1],g[MAXN+1][MAXN+1];
    bool inq[MAXN+1];
    void input();
    void min_dist(int);
    int main() {
        cin>>N>>M;
        for (int i=1;i<=N;i++)
            for (int j=1;j<=N;j++)
                g[i][j]=dist[i][j]=INF;
        for (int i=0;i<M;i++)
        {
            int u,v,len;cin>>u>>v>>len;
            g[u][v]=g[v][u]=len;
        }
        for (int i=1;i<=N;i++)
            for (int j=1;j<=N;j++)
            {
                if (g[i][j]==INF)   continue;
                int beflen=g[i][j];
                g[i][j]=g[j][i]=INF;
                min_dist(i);
                ans=min(ans,dist[i][j]+beflen);
                g[i][j]=g[j][i]=beflen;
            }
        cout<<ans;
        return 0;
    }
    
    void min_dist(int sor)
    {
        while (!q.empty())  q.pop();
        memset(inq,false,sizeof(inq));
        for (int i=1;i<=N;i++)  dist[sor][i]=INF;
        dist[sor][sor]=0;inq[sor]=true;
        q.push(sor);
        while (!q.empty())
        {
            int now=q.front();q.pop();
            for (int i=1;i<=N;i++)
                if (dist[sor][i]>dist[sor][now]+g[now][i]){
                    dist[sor][i]=g[now][i]+dist[sor][now];
                    if (!inq[i]){
                        q.push(i);inq[i]=true;
                    }
                }
            inq[now]=false;
        }
    }
    
  • 1

信息

难度
3
分类
(无)
标签
(无)
递交数
30
已通过
18
通过率
60%
被复制
3
上传者