usaco Fence Loops(DFS)
2015-09-29 09:31
302 查看
在一个无向联通图里找最小环,难点是给的数据是边与边的相连情况,而不是点与点。
直接DFS从一个一条虚拟的0号边出发,在当前最新加入的边的另一端加上一个未访问过的边。数据量不大,效率还是挺好的。
这题写的时候感觉纯粹是打了好多补丁的感觉,写完后发现也挺简洁的。
总之,解决算法问题必须先考虑到所有的边界,特殊情况,然后再动手,不然很耗费时间。
Your program ('fence6') produced all correct answers! This is your submission #2 for this problem.
直接DFS从一个一条虚拟的0号边出发,在当前最新加入的边的另一端加上一个未访问过的边。数据量不大,效率还是挺好的。
这题写的时候感觉纯粹是打了好多补丁的感觉,写完后发现也挺简洁的。
总之,解决算法问题必须先考虑到所有的边界,特殊情况,然后再动手,不然很耗费时间。
USER: fan fu [modengd1] TASK: fence6 LANG: C++ Compiling... Compile: OK Executing... Test 1: TEST OK [0.008 secs, 3384 KB] Test 2: TEST OK [0.008 secs, 3384 KB] Test 3: TEST OK [0.008 secs, 3384 KB] Test 4: TEST OK [0.005 secs, 3384 KB] Test 5: TEST OK [0.008 secs, 3384 KB] Test 6: TEST OK [0.008 secs, 3384 KB] Test 7: TEST OK [0.008 secs, 3384 KB] Test 8: TEST OK [0.046 secs, 3384 KB] Test 9: TEST OK [0.019 secs, 3384 KB] All tests OK.
Your program ('fence6') produced all correct answers! This is your submission #2 for this problem.
/* ID: modengd1 PROG: fence6 LANG: C++ */ #include <iostream> #include <stdio.h> #include <vector> #include <memory.h> using namespace std; bool A[2][101][101];//与每条围栏一边相连的情况 int len[101]; bool vis[101]; int path[101]; int N,ans; bool connet(int a,int b,int c)//c号边是否和a,b的交点相连 { return((A[0][a][c]&&A[0][b][c])||(A[1][a][c]&&A[1][b][c])); } void getinput() { memset(A,false,sizeof(A)); scanf("%d",&N); for(int i=0;i<2;i++)//任何边都和0号边相连 { for(int j=1;j<=N;j++) A[i][j][0]=A[i][0][j]=true; } int ls,s,N1s,N2s,a,b; for(int i=1;i<=N;i++) { scanf("%d%d%d%d",&s,&ls,&N1s,&N2s); len[s]=ls; for(int j=0;j<N1s;j++) { scanf("%d",&a); A[0][s][a]=true; } for(int j=0;j<N2s;j++) { scanf("%d",&b); A[1][s][b]=true; } } } int lenvis[101]; void DFS(int lenght,int nowindex,int lastindex,int deep) { if(lenght>ans) return; lenvis[nowindex]=lenght; path[deep]=nowindex; for(int i=0;i<=(deep-3);i++)//若新加进来的边和此前路劲上的某两个边的交点相连时 { if(connet(path[i],path[i+1],nowindex)) ans=min(ans,lenght-len[i]); } for(int j=1;j<=N;j++) { //选择一个未访问的且和nowindex相连,且相连的同一端未和lastindex相连的一条围栏,lastindex等于0时,忽略(同一端未和lastindex相连)这一条件 if(((A[0][j][nowindex]&&(!A[0][j][lastindex]||lastindex==0))||(A[1][j][nowindex]&&(!A[1][j][lastindex]||lastindex==0)))&&!vis[j]) { vis[j]=true; DFS(lenght+len[j],j,nowindex,deep+1); vis[j]=false; } } } int main() { freopen("fence6.in","r",stdin); freopen("fence6.out","w",stdout); ans=0x7fffffff; getinput(); vis[0]=true; path[0]=0; for(int i=1;i<=N;i++) { vis[i]=true; path[1]=i; DFS(len[i],i,0,1); vis[i]=false; } cout<<ans<<endl; return 0; }
相关文章推荐
- Esper之事件——篇2(esper Reference)
- jquery中的each()方法详解
- pace.js页面加载进度条插件
- jQuery 源码 extend
- JavaScript权威指南_163_第17章_事件处理_17.2-注册事件处理程序-设置HTML标签属性为事件处理程序
- css3之BFC、IFC、GFC和FFC
- js/jquery判断浏览器的方法总结
- jspSmarUpload组件中的主要类
- c#开发之三---前端技术DOM
- c#开发之二---前端技术javascript
- 150929-拖延高于懒-HTML(End)
- c#开发之一---前端技术html/css
- javascript:使用代理绑定事件
- js计算系统当前日期是星期几的几种方法
- React显示和提交数据
- html5:localStorage储存
- js强制把网址设为默认首页
- JavaScript概要
- extJS
- javascript判断是否按回车键