软件测试与验证 prime_path 基路径算法暴力版
2015-09-26 10:59
405 查看
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <string> #include <set> #include <utility> #include <functional> using namespace std; #define pb push_back const int maxn = 110; const int N=100; const int inf = 0x3f3f3f3f; typedef vector<int> vi; bool circle(vi v){ if(v.size()<=1) return false; return v[0]==v[v.size()-1]; } vi s,e; int n,m; int tot; int head ; struct Edge{ int to,nxt; }edge[N*N*2]; void addEdge(int u,int v){ edge[tot].to=v; edge[tot].nxt=head[u]; head[u]=tot++; } int in ,out ; void init(){ s.clear(); e.clear(); tot=0; memset(head,-1,sizeof head); memset(in,0,sizeof in); memset(out,0,sizeof out); } vector<vi> ans; queue<vi> q; vi tmp; bool isEnd(vi v){ if(v.size()==0) return false; for(int i=0;i<v.size();i++) if(v[i]==e[0]) return true; return false; } bool ok(vi v,int val){ vi tmp=v; if(v.size()<=2) return true; for(int i=1;i<v.size();i++) if(v[i]==val) return false; return true; } bool isSub(vi v,vi u){ int l1=v.size(),l2=u.size(); if(l1>=l2) return false; for(int i=0;i+l1-1<l2;i++){ bool same=true; for(int j=0;j<l1 && same;j++) if(v[j]!=u[j+i]) same=false; if(same) return true; } return false; } void prime_path(){ ans.clear(); while(!q.empty()) q.pop(); for(int i=1;i<=n;i++){ tmp.clear(); tmp.pb(i); q.push(tmp); } while(!q.empty()){ vi now=q.front();q.pop(); if(circle(now) || isEnd(now)){ ans.pb(now);continue; } int u=now[now.size()-1]; bool fi=false; for(int k=head[u];~k;k=edge[k].nxt){ int v=edge[k].to; vi tmp=now; if(ok(tmp,v)) { fi=true; tmp.pb(v); q.push(tmp); } } if(!fi) ans.pb(now); } int cnt=0; for(int i=0;i<ans.size();i++){ bool sub=false; for(int k=0;k<ans.size() && sub==false;k++) if(k!=i && isSub(ans[i],ans[k])) sub=true; if(sub) continue; cnt++; for(int j=0;j<ans[i].size();j++){ cout<<ans[i][j]<<" "; } cout<<endl; } cout<<"whole number: "<<cnt<<endl; } int main() { #ifndef ONLINE_JUDGE freopen("aaa","r",stdin); #endif init(); cin>>n>>m; for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; addEdge(u,v); in[v]++;out[u]++; } for(int i=1;i<=n;i++){ if(out[i]==0) e.pb(i); if(in[i]==0) s.pb(i); } prime_path(); return 0; }
相关文章推荐
- 关于Xutils框架出现无法访问HttpRequestBase 找不到org.apache.http.client.methods.HttpRequestBase解决方案
- PAT(甲级)1059
- ArcGIS教程:坡度
- ViewPager防止Fragment销毁以及取消Fragment的预加载
- 原生js多动画同时运动框架(style属性多项同时改变)
- 观察UDP buffer size 情况
- PAT(甲级)1058
- 条款42:了解typename的双重意义
- JMS学习
- 283:Move Zeroes
- 大话设计模式笔记 观察者模式
- (算法)和为0的最大连续子数组
- 树的深度优先与广度优先遍历
- 用硕鼠下载土豆视频
- 条款41:了解隐式接口和编译期多态
- 线段树查询
- 野人学Android基础篇之网络通讯第二课--本地apache服务器与Android的连接
- cmd命令 从C盘转到D盘
- 滴滴出行2015在线笔试题目
- C++ string类型的split字符串分割函数