Floyd求最小环

观光旅游

题目描述

湖南师大附中成为百年名校之后,每年要接待大批的游客前来参观。学校认为大力发展旅游业,可以带来一笔可观的收入。 描述 Description   学校里面有N个景点。两个景点之间可能直接有道路相连,用Dist[I,J]表示它的长度;否则它们之间没有直接的道路相连。这里所说的道路是没有规定方向的,也就是说,如果从I到J有直接的道路,那么从J到I也有,并且长度与之相等。学校规定:每个游客的旅游线路只能是一个回路(好霸道的规定)。也就是说,游客可以任取一个景点出发,依次经过若干个景点,最终回到起点。一天,Xiaomengxian决定到湖南师大附中旅游。由于他实在已经很累了,于是他决定尽量少走一些路。于是他想请你?D?D一个优秀的程序员?D?D帮他求出最优的路线。怎么样,不是很难吧?

输入格式

输入中有多组数据。请用SeekEof判断是否到达文件结束。 对于每组数据: 第一行有两个正整数N,M,分别表示学校的景点个数和有多少对景点之间直接有边相连。(N<=100,M<=10000) 以下M行,每行三个正整数,分别表示一条道路的两端的编号,以及这条道路的长度。

输出格式

对于每组数据,输出一行: 如果该回路存在,则输出一个正整数,表示该回路的总长度;否则输出“No solution.”(不要输出引号)

样例输入

5 6
1 4 1
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20
4 3
1 2 10
1 3 20
1 4 30

样例输出

61
No solution.

题目显然是要求图中的最小环

摘自百度百科

朴素算法:

最小环问题朴素算法
令e(u,v)表示u和v之间的连边,再令min(u,v)表示,删除u和v之间的连边之后,u和v之间的最短路
最小环则是:min(u,v) + e(u,v)
时间复杂度O(EV^2)

最小环问题传统的解决方法:dijkstra

任意一个环的权值,我们都可以看成两个有边相连的结点i、j的直接距离加上i、j间不包含边(边i->j)的最短路径。求最短路径我们第一个想到的就是Dijkstra算法。而Dijkstra所求的是一个点到所有点的最短距离。用Dijkstra所求的i、j的最短距离一定是i、j的直接距离(如果i,j连通),所以我们需要先将i、j的边从图中删除(若i,j不连通,则不用删除),再用Dijkstra求新图中i、j的最短距离即可。所以我们每次在图中选取一条边,把它从图中删掉.然后对删掉的那条边所对应的2点进行Dijkstra,也就是m次Dijkstra

Floyd求最小环O(n^3)

w[i][j]用来求最短路,s[i][j]用存原图
for (int k=1;k<=n;k++)
{
	for (int i=1;i<k;i++)//判断回路 
	{
		for (int j=i+1;j<k;j++)
			ans=min(ans,w[i][j]+s[i][k]+s[k][j]);
    此时w[k-1][i][j]已经求出,而且此时i到j的最短路保证不经过k,用w[k-1][i][j],s[i][k],s[k][j]来计算可以保证ijk构成的是环,而且w[i][j]+s[i][k]+s[k][j]是当前最小的环
	}
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j++)
		{
			w[i][j]=min(w[i][j],w[i][k]+w[k][j]);
		}
	}
}

Tarjan求环O(n^2)

P3387

void Tarjan(int u){
     dfn[u]=low[u]=++Time;
     sta[++top]=u;vis[u]=1;
     for(int i=heade[u];i;i=e[i].next){
        int v=e[i].to;
        if(!dfn[v]){
           Tarjan(v);
           low[u]=std::min(low[u],low[v]);
        }
        else{
            if(vis[v]){
               low[u]=std::min(low[u],dfn[v]);
            }
        }
     }
     if(dfn[u]==low[u]){
       ++tot;
       while(sta[top+1]!=u){
          int v=sta[top];
          belong[v]=tot;
          vis[v]=0;
          sum[tot]+=a[sta[top--]];
       }
     }
}
posted @   Chano_sb  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示