Uva247.Calling Circles(Floyd求连通性)

UVA247电话圈问题解析
本文针对UVA247问题提供了解决方案,利用Floyd传递闭包算法来找出所有可能形成的电话圈,并通过代码示例详细解释了实现过程。

Uva247.Calling Circles (Floyd传递闭包)

Description

现有n个人(n25)个人打电话,若a打给bb打给cc打给a,则称a,b,c组成了一个电话圈。现在给出nm条电话信息,求出所有的电话圈,并以任意顺序输出每个电话圈中的每个人。

Solution

Floyd传递闭包

通关传递闭包运算,求出每个人之间的连通性。当且仅当abba说明a,b在一个电话圈中。

Tarjan强连通分量

题面描述就是裸地Tarjan求强连通分量的题目,直接套板子就好。

Code

这里给出的是Floyd传递闭包的解法。

#include<bits/stdc++.h>
#define ll long long
#define nmax 50
using namespace std;
int mp[nmax][nmax];
bool isout[nmax];
string hashback[nmax];
map<string,int> mmp;
struct mes{
    string a,b;
}mes[nmax * nmax];
int n,m,cnt = 1;
void floyd(){
    for(int k = 1;k<=n;++k){
        for(int i = 1;i<=n;++i){
            for(int j = 1;j<=n;++j){
                if(mp[i][k])
                    mp[i][j] = mp[i][j] || (mp[i][k] && mp[k][j]);
            }
        }
    }
}
int main(){
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    int kase = 1;
    while(cin>>n>>m){
        if(n == 0 && m ==0) break;
        if(kase>=2) cout<<endl;
        cnt = 1;mmp.clear();
        memset(mp,0,sizeof mp);
        for(int i = 0;i<m;++i){
            cin>>mes[i].a>>mes[i].b;
            if(mmp.count(mes[i].a) == 0) {mmp[mes[i].a] = cnt,hashback[cnt] = mes[i].a;cnt++;}
            if(mmp.count(mes[i].b) == 0) {mmp[mes[i].b] = cnt,hashback[cnt] = mes[i].b;cnt++;}
        }
        for(int i = 0;i<m;++i){
            string a = mes[i].a,b = mes[i].b;
            mp[mmp[a]][mmp[b]] = 1;
        }
        floyd();
        memset(isout,0,sizeof isout);
        cout<<"Calling circles for data set "<<kase++<<":"<<endl;
        for(int i = 1;i<=n;++i){
            if(isout[i]) continue;
            cout<<hashback[i];isout[i] = true;
            for(int j = 1;j<=n;++j){
                if(i!=j&&mp[i][j] && mp[j][i]){
                    cout<<", "<<hashback[j];
                    isout[j] = true;
                }
            }
            cout<<endl;
        }
    }
    return 0;
}
在使用 DMol³ 进行分子或材料体系的量子化学计算时,出现 `DMol3 job failed` 错误,并提示 `geometry optimization did not converge` 是较为常见的问题。该错误通常表明几何优化过程未能在设定的最大迭代次数内达到收敛标准。 ### 常见原因及解决方法 #### 1. 初始结构不合理 初始结构中原子位置不合理、键长过短或角度异常可能导致能量面过于陡峭或存在局部势垒,使优化难以收敛[^1]。 - **解决方法**: - 使用分子建模软件(如 Materials Studio)手动调整原子位置,避免原子重叠。 - 在优化前先进行力场预优化(如使用 Forcite 模块),以获得更合理的初始构型[^1]。 #### 2. 收敛标准过于严格 默认的收敛标准可能对于某些复杂体系(如过渡金属配合物或大分子体系)过于苛刻,导致无法满足条件。 - **解决方法**: - 调整收敛标准:可在任务设置中适当放宽力或能量收敛阈值(例如将 `Energy tolerance` 和 `Force tolerance` 设置为较宽松的值,如 `5.0e-5 Ha/Å`)。 - 更改优化算法:尝试使用不同的优化算法(如 BFGS 或 SD)来提高收敛性。 #### 3. 电子结构计算未收敛 几何优化失败有时是由于 SCF(自洽场)计算未能收敛所引发的连锁反应。 - **解决方法**: - 提高 SCF 收敛精度:可尝试启用 `Density mixing` 或调整 `Mixing scheme`(如采用 Kerker 或 Pulay 方法)。 - 添加电子温度:对于金属体系,可以开启有限电子温度(`Electron smearing`)以改善收敛。 #### 4. 力的计算不准确 在使用数值导数计算力时,若基组不够大或网格划分不够精细,可能导致力的误差较大,从而影响优化过程。 - **解决方法**: - 提高积分网格精度(如将 `Grid` 设置为 `Fine` 或 `Ultrafine`)。 - 使用更大的基组(如 DNP 增强版本)以提升力的计算精度。 #### 5. 存在对称性限制或约束条件冲突 如果设置了不当的对称性限制或原子固定条件,也可能导致优化路径受限而无法收敛。 - **解决方法**: - 检查是否设置了不必要的固定原子或对称性约束。 - 尝试在优化初期取消所有约束,待结构稳定后再逐步引入约束条件。 #### 6. 体系本身存在多个低能态或过渡态 某些体系可能存在多个接近的能量极小值或处于鞍点附近,使得优化容易陷入局部最小值。 - **解决方法**: - 使用不同初始结构尝试优化。 - 结合频率分析判断是否处于过渡态(若为过渡态则需使用过渡态搜索方法)。 --- ### 示例:调整收敛标准和优化算法(Materials Studio 输入参数) ```plaintext Geometry Optimization: Method: BFGS Max. steps: 200 Energy convergence: 5.0e-5 Ha Force convergence: 3.0e-3 Ha/Å SCF: Convergence: 1.0e-6 Ha Mixing scheme: Pulay ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值