Uva 12544 - Beehives 找无向图的最小环..BFS..
来源:互联网 发布:ubuntu显示所有软件 编辑:程序博客网 时间:2024/06/05 15:27
题意:
给了一个无向图(至多700个点,两点间无重边),问其中边数最少的环是所少条边
题解:
这类问题可以用Floyd做..但是会超时...
用BFS的方法,思路就是形成了环,则必然是搜索树上有了前向或者平行边..枚举每个点位根..做BFS..按照遍历的顺序给每个点标号..当找到一个已经标号的边..则知道形成了环..距离为dis[u]+dis[v]-1...但是这种方法只能求这种边权值都为1的最小环...加些条件就很容易出错了..而Floyd的方法适用范围更广...
Program(Floyd,TLE):
#include<iostream>#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>#include<cmath>#define oo 1000000007#define MAXN 505using namespace std;int Dist[MAXN][MAXN],Graph[MAXN][MAXN];int MC(int nVertex){ int mincircle=oo,i,j,k,temp; for (i=0;i<nVertex;i++) for (j=0;j<nVertex;j++) Dist[i][j]=Graph[i][j]; for(k=0;k<nVertex;++k) { //新增部分: for(i=0;i<k;++i) for(j=0;j<i;++j) if (mincircle>Dist[i][j]+Graph[j][k]+Graph[k][i]) mincircle = Dist[i][j]+Graph[j][k]+Graph[k][i]; //通常的 floyd 部分: for(i=0;i<nVertex;++i) for(j=0;j<i;++j) { temp = Dist[i][k] + Dist[k][j]; if(temp < Dist[i][j]) Dist[i][j] = Dist[j][i] = temp; } } return mincircle;}int main(){ int C,cases,N,M,u,v,ans; scanf("%d",&C); for (cases=1;cases<=C;cases++) { scanf("%d%d",&N,&M); for (u=0;u<N;u++) for (v=0;v<N;v++) Graph[u][v]=oo; while (M--) { scanf("%d%d",&u,&v); Graph[u][v]=Graph[v][u]=1; } ans=MC(N); printf("Case %d: ",cases); if (ans==oo) puts("impossible"); else printf("%d\n",ans); } return 0;}
Program(BFS,AC):
#include<iostream>#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>#include<cmath>#define oo 1000000007#define MAXN 505using namespace std;struct node{ int v,next,id;}edge[50005];int Ne,_next[MAXN],dfn[MAXN],id[MAXN],ans; queue<int> Q;void addedge(int u,int v,int id){ edge[++Ne].next=_next[u],_next[u]=Ne; edge[Ne].v=v,edge[Ne].id=id;} int main(){ int C,cases,N,M,u,v,i,k; scanf("%d",&C); for (cases=1;cases<=C;cases++) { scanf("%d%d",&N,&M); memset(_next,0,sizeof(_next)),Ne=0; for (i=1;i<=M;i++) { scanf("%d%d",&u,&v),u++,v++; addedge(u,v,i),addedge(v,u,i); } ans=oo; for (i=1;i<=N;i++) { memset(dfn,0x7f,sizeof(dfn)); memset(id,0,sizeof(id)); Q.push(i); dfn[i]=0; while (Q.size()) { u=Q.front(),Q.pop(); for (k=_next[u];k;k=edge[k].next) if (id[u]!=edge[k].id) { v=edge[k].v; if (dfn[v]>oo) { dfn[v]=dfn[u]+1; id[v]=edge[k].id; Q.push(v); }else ans=min(ans,dfn[v]+dfn[u]+1); } } } printf("Case %d: ",cases); if (ans==oo) puts("impossible"); else printf("%d\n",ans); } return 0;}
- Uva 12544 - Beehives 找无向图的最小环..BFS..
- Regionals 2012, Europe - Southwestern A.Beehives(BFS求无向图最小环)
- 找无向图最小环 floyd算法
- POJ 1734 - Sightseeing trip 用Floyd找无向图的最小环
- 无向图最小环
- 有向图无向图的最小环。
- hdu 1599 find the mincost route(找无向图最小环)(floyd求最小环)
- hdu1599求无向图的最小环
- POJ 1734 Sightseeing trip 无向图的最小环
- poj 1734 无向图的最小环
- hdu1599 无向图最小环
- 无向图-最小环-Floyd
- 无向图最小环算法floy
- hdu 1599 find the mincost route(找无向图最小环)
- 最小环(有向无向均可)
- BOJ 297 最小环问题 无向图最小环,floyd
- poj 无向图最小环问题 详解,模板
- FZU 2090 无向图最小环 floyd
- 每天一个linux命令(8):cp 命令
- 每天一个linux命令(9):touch 命令
- 将整数以二进制的形式输出来
- IE6、IE7、IE8的CSS、JS兼容
- 银行系统
- Uva 12544 - Beehives 找无向图的最小环..BFS..
- UE运行可执行程序
- 关于MultiByteToWideChar及WideCharToMultiByte使用方法
- 静态邻接表模版
- Canvas 生成交互动画
- 学习boost笔记-- 随想
- 每天一个linux命令(10):cat 命令
- 匈牙利算法
- php学习之自定义函数(3)