floyd最小环
来源:互联网 发布:网络大电影投资与回报 编辑:程序博客网 时间:2024/05/17 01:14
Description
Input
接下来的M行里,每行包括3个整数a,b,c.代表a和b之间有一条通路,并且需要花费c元(c <= 100)。
Output
Sample Input
3 31 2 12 3 11 3 13 31 2 11 2 32 3 1
Sample Output
3It's impossible.
解法:用floyd求出该无向图的最小环
以知floyd可以求出i到j的最短路,而一个环可以看作是边dis[i][j]+map[i][k]+map[k][j];所以求最小环可以在不断更新最短路中更新最小环。
#include<stdio.h>#include<string.h>#define maxn 1005#include <algorithm>#include<iostream>#define INF 0xffffffusing namespace std;int map[maxn][maxn],vis[maxn],dis[maxn][maxn];int n,m;void floydcircle(){int ans,minx;ans=INF;for(int i=0;i<maxn;i++){for(int j=0;j<maxn;j++){dis[i][j]=map[i][j];//不能先更新最短路再求最小环,因为}}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(minx>dis[i][j]+map[i][k]+map[k][j]&&i!=k&&i!=k&&i!=j){minx=dis[i][j]+map[i][k]+map[k][j];//不能先更新最短路再求最小环,因为i到k和k到j有重合的地方if(ans>minx){ans=minx;}}}}
//更新最短路的d[i][j]for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);}}}if(ans>=INF) printf("It's impossible.\n");else printf("%d\n",ans);}int main(void){//freopen("in.txt","r",stdin); while(~scanf("%d%d",&n,&m)) { int a,b,c; for(int i=0;i<maxn;i++){for(int j=0;j<maxn;j++)map[i][j]=INF;} for(int i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) { map[a][b]=c; map[b][a]=c; } } floydcircle(); } return 0;}
- floyd求最小环
- floyd求最小环
- floyd求最小环
- floyd求最小环
- FLOYD 求最小环
- floyd求最小环
- floyd最小环
- 最小环(floyd)
- hdu1599+floyd最小环
- floyd求最小环
- Floyd求最小环
- Floyd最小环算法
- floyd求最小环
- floyd求最小环
- floyd最小环
- floyd算法求最小环
- Floyd算法求最小环
- floyd求最小环 模板
- 入门视频采集与处理(BT656简介) 转
- 关于git中tag的一些问题
- android中popupwindow弹出后,屏幕背景变成半透明
- Android中字体加粗注意事项
- SAP的采购组
- floyd最小环
- PHP中命名空间
- 标签属性方式设置字段formatter时,发现没有效果
- 线程池ThreadPoolExecutor参数设置
- java选择排序方法
- safari浏览器 session tomcat服务器
- C++学习 (使用类)
- 微软算法100道题-----输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点
- Android webview使用详解