1 条题解
-
0梦萦枯野 LV 8 @ 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
- 上传者