CF1206D Shortest Cycle

1522713-20190822141053437-833243410.png
1522713-20190822141102310-2076491120.png


思路

根据所谓的抽屉原理,当n特别大的时候,就会出现几个三元环,这时的答案就是3

其他的跑floyd暴力


#include <cstdio> 
 
using namespace std;
 
const int sz = 2000000, maxn = 130, inf = 70000000;
 
char buf[sz], *p1 = buf, *p2 = buf;
inline char gc() { return p1==p2&&(p2=(p1=buf)+fread(buf,1,sz,stdin), p1==p2)?EOF:*p1++; }
inline long long read() {
    long long x = 0;
    int f = 1;
    char ch = gc();
    while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = gc(); }
    while(ch >= '0' && ch <= '9') x = (x<<3)+(x<<1)+(ch&15), ch = gc();
    return x *= f;
}
 
inline int min(int a, int b) { return a < b ? a : b; }
 
long long a[maxn];
int f[maxn][maxn], m[maxn][maxn];
 
int main() {
    int n = (int)read();
    int ans = inf;
    for(int i = 1; i <= n; i++) {
        if(i >= 128) break;
        a[i] = read();
        if(!a[i]) {
            n--; i--;   
        }
    }
    if(n >= 128) {
        printf("3\n");
        return 0;   
    }
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            if((a[i] & a[j]) && (i != j))
                f[i][j] = m[i][j] = 1;
            else
                f[i][j] = m[i][j] = inf;
    for(int k = 1; k <= n; k++) {
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++) {
                if(i == j || j == k || k == i) continue;
                ans = min(ans, f[i][j]+m[i][k]+m[k][j]);
            }
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                if(f[i][j] > f[i][k] + f[k][j])
                    f[i][j] = f[i][k] + f[k][j];
    }
    printf("%d\n", ans==inf?-1:ans);    
    return 0;   
}

溜了溜了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
k-shortest c是一种图算法,用于寻找图中从一个起点到一个终点的k条最短路径。该算法可以应用于许多实际问题,例如网络路由,行程规划等。 k-shortest c算法的基本原理是在每一次迭代中,从起点到终点寻找一条最短路径,并将其添加到结果集中。然后,根据路径长度对图中的边进行更新,使得之后的迭代可以找到更短的路径。这个过程会重复k次,直到找到k条最短路径为止。 该算法可以通过以下步骤实现: 1. 设置起点和终点,并初始化结果集为空。 2. 在每次迭代中,使用Dijkstra或A*等最短路径算法找到一条最短路径。 3. 将找到的最短路径添加到结果集中。 4. 更新路径中的边的权值,使得之后的迭代可以找到更短的路径。 5. 重复步骤2-4,直到找到k条最短路径为止。 k-shortest c算法的优点是能够在不遍历整个图的情况下找到多条最短路径,从而减少了计算量。它可以提供多个解决方案供选择,使得问题的解决更加灵活。 然而,k-shortest c算法也存在一些问题。首先,随着k值的增加,算法的计算复杂度也会增加,因此在实际应用中需要权衡计算资源和最优解之间的平衡。其次,算法在处理大规模图形时可能会受到内存和计算能力的限制。 在总结中,k-shortest c是一种寻找k条最短路径的图算法,适用于各种实际问题。它通过迭代找到一条条最短路径,并更新路径的边权值,以获得更多的解决方案。尽管算法存在一些限制,但它仍然是解决某些问题的有效工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值