在一个无向联通图里找最小环,难点是给的数据是边与边的相连情况,而不是点与点。
直接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; }
原文:http://www.cnblogs.com/modengdubai/p/4845510.html