这题不难,求哈密顿路的,就是多了一个限制条件。
主要是合并满足给定路径的哈密顿路时要进行合并,可以用并查集的来做,我是直接用哈希表来做的,求出满足条件一共有几组的聚集后,其实就是求这些聚集的一个全排列,只不过聚集本身有可以变换为两种情况,不管怎样,这在高中排列组合中学过,还是很简单的。
另外,由于Java中提供了大数,因此可以用大数做比较大的那种运算,如求50的全排列。
~~.
import java.util.*;
import java.util.regex.*;
import java.math.*;
public class HamiltonPath {
public int countPaths(String[] roads) {
int ans=0;
int n=roads.length;
char[][] matrix=new char[n][n];
Vector<HashSet<String>> vec=new Vector<HashSet<String>>();
for(int i=0;i<n;i++){
matrix[i]=roads[i].toCharArray();
}
for(int i=0;i<n;i++){
int iflag=0;
for(int j=0;j<n;j++){
if(matrix[i][j]=='Y')
iflag++;
}
if(iflag>2)
return 0;
}
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(matrix[i][j]=='Y'){
Vector<HashSet<String>> ll=new Vector<HashSet<String>>();
boolean isIn=false;
for(HashSet<String> hs:vec){//loop 1
if(hs.contains(i+"")){
if(hs.contains(j+""))
return 0;
else{
ll.add(hs);
hs.add(j+"");
isIn=true;
}
}else if(hs.contains(j+"")){
if(hs.contains(i+""))
return 0;
else{
ll.add(hs);
hs.add(i+"");
isIn=true;
}
}
}//loop 1 over
merge(ll,vec);
if(!isIn){
HashSet<String> hs=new HashSet<String>();
hs.add(i+"");
hs.add(j+"");
vec.add(hs);
}
}//if
}//inner for loop
}//outter for loop
int temp=0;
for(HashSet<String> hs:vec){
temp+=hs.size();
}
int n1=n-temp;
int n2=vec.size();
BigInteger big=getAllPos(n1+n2);
long pow=get2Pow(n2);
big=big.multiply(new BigInteger(pow+""));
ans=big.mod(new BigInteger(""+1000000007)).intValue();
return ans;
}
BigInteger getAllPos(int n){
BigInteger ans=BigInteger.ONE;
for(int i=1;i<=n;i++)
ans=ans.multiply(new BigInteger(i+""));
return ans;
}
void merge(Vector<HashSet<String>> ll,Vector<HashSet<String>> vec){
if(ll.size()>1){
HashSet<String> init=ll.get(0);
for(int i=1;i<ll.size();i++){
Iterator<String> itor=ll.get(i).iterator();
while(itor.hasNext())
init.add(itor.next());
}
for(int i=1;i<ll.size();i++){
vec.remove(ll.get(i));
}
}
}
long get2Pow(int n){
long ans=1;
while(n-->0){
ans*=2;
}
return ans;
}
}
分享到:
相关推荐
topcoder的数学类算法题目。一个整数被称为k-smooth当且仅当它的最大素因子不大于k,给定N和K,计算出1 - N中有多少个整数是k-smooth。1 , 1 <= K <= 1000.
SRM2Multi dumper for hsap
omron系列CPM1/CPM1A/CPM2A/CPM2C/SRM1(-V2) PLC编程手册pdf,omron系列CPM1/CPM1A/CPM2A/CPM2C/SRM1(-V2) PLC编程手册
SAP SRM 介绍
Driver HASP SRM emulator (x86)
版本: 1.0.0 作者: Semen Zhydenko ... BridgeCrossingOptimized.java - SRM 146 DIV 2,1000 点问题,时间复杂度 O(n^(n^2))。 BridgeCrossingBest.java - SRM 146 DIV 2,1000 点问题,时间复杂度 O(n)。
多年SRM实施经验总结,对希望从事SRM实施或规划的同学们有帮助
srm后端JAVA 供应商平台管理 标准物资开票表 bus_standard_invoice_out增加freeze_quantity(冻结数量这一列)。 标准物资开票表 bus_standard_invoice_out的主键为{行项目、采购订单号、物料凭证}。 标准物资...
分块描述SRM系统的作用:寻源、协同和考核 涉及具体的业务用途,供前期规划作参考,可根据实际情况调整,再考虑如何实现
ASP SRM USB Command Line Dumper Instructions. HASP SRM USB命令行转储指令。 WARNING!!! Before make dump from dongle make sure that you install the ...2. 2. Execute h7dmp.exe file. 执行h7dmp.exe文件。
简叙什么是SRM,SRM解决什么问题,SRM有用途,SRM功能等
SRM210 (PA)SAP SRM Server Configuration (Col92) Configuration
HASP_SRM_Runtime_setup
SRM Overview中文版让你更直观更容易了解SRM是什么,能做什么
SRM空间富模型隐写分析算法,选区高维特征,使用集成分类器进行训练
SRM影像分割算法的matlab程序,主函数SRM_new
不仅可以阅读srm格式文件,还可以制作文档。完全绿色破解,是一款不错的srm阅读器。
HASP SRM加密狗简介,阿拉丁公司的各种加密够简介
Workflow Guide SAP SRM 2007
不错的VMware SRM资料,可以看看