1 条题解
-
0
梦萦枯野 LV 8 @ 6 年前
要找出无向图的最小环。我用了比较差的算法:
对于两个有边连接的点,删掉它们之间的边之后两点的最短距离,与两点之间边的距离之和,有可能是最小环的周长。
枚举每一对有边连接的点,先把连接边的长度设为无穷大,再求两点的最短路,用得到的答案更新最终答案。
实际上有更好的算法。请搜索无向图最小环。
- 1
信息
- 难度
- 3
- 分类
- (无)
- 标签
- (无)
- 递交数
- 30
- 已通过
- 18
- 通过率
- 60%
- 被复制
- 3
- 上传者
要找出无向图的最小环。我用了比较差的算法:
对于两个有边连接的点,删掉它们之间的边之后两点的最短距离,与两点之间边的距离之和,有可能是最小环的周长。
枚举每一对有边连接的点,先把连接边的长度设为无穷大,再求两点的最短路,用得到的答案更新最终答案。
实际上有更好的算法。请搜索无向图最小环。
#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;
}
}