• b_aw_排序 & 奶牛比赛(floyd传递闭包)


    排序

    给定m对不等时,从前往后遍历每对关系,每次遍历时判断:

    • 如果能够确定全部关系且无矛盾,则结束循环,输出确定的次序;
    • 如果发生矛盾,则结束循环,输出有矛盾;
    • 如果循环结束时没有发生上述两种情况,则输出无定解。

    思路:只要没确定所有关系或没找到矛盾,则没输入一对数据,用floyd更新闭包

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=30;
    int n,m,g[N][N],f[N][N],vis[N];
    void floyd() {
        memcpy(f,g,sizeof g);
        for (int k=0; k<n; k++)
        for (int i=0; i<n; i++)
        for (int j=0; j<n; j++) {
            f[i][j]|=f[i][k]&&f[k][j];
        }
    }
    int get_type() {
        for (int i=0; i<n; i++) if (f[i][i]) return 2; //矛盾
        for (int i=0; i<n; i++)
        for (int j=0; j<i; j++) if (!f[i][j] && !f[j][i]) //无法确定关系
            return 0;
        return 1;   //可确定所有关系
    }
    char get() {
        for (int i=0; i<n; i++) if (!vis[i]) {
            bool valid=true;
            for (int j=0; j<n; j++) {
                if (!vis[j] && f[j][i]) { //如果有比i还要小的字母未输出,则证明i不是合法闭包中字母
                    valid=false;
                    break;
                }
            }
            if (valid) {
                vis[i]=1;
                return (char) ('A'+i);
            }
        }
    }
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0);
        while (cin>>n>>m, n||m) {
            memset(f,0,sizeof f), memset(g,0,sizeof g);
            int type=0,cnt;
            for (int i=0; i<m; i++) {
                string s; cin>>s;
                int u=s[0]-'A', v=s[2]-'A';
                if (type==0) {
                    g[u][v]=1; //u<v
                    floyd(); //传递闭包
                    type=get_type();
                    if (type!=0) cnt=i+1;
                }
            }
            if (type==1) {
                memset(vis,false,sizeof vis);
                printf("Sorted sequence determined after %d relations: ", cnt);
                for (int i=0; i<n; i++) printf("%c",get()); printf(".
    ");
            }else if (type==2) printf("Inconsistency found after %d relations.
    ", cnt); 
             else              printf("Sorted sequence cannot be determined.
    ");
        }
        return 0;
    }
    

    奶牛比赛

    n头牛,且给出m对信息表示比赛结果a、b,表示a赢了b;求排名可以确定的奶牛的数目

    思路:如果一个奶牛可以和其他奶牛确定关系,则说明该奶牛可确定排位

    #include<bits/stdc++.h>
    using namespace std;
    const int N=4505;
    int n,m,f[N][N]; //f[i][j]=1表示i和j的关系可以确定
    void floyd() {
        for (int k=1; k<=n; k++)
        for (int i=1; i<=n; i++)
        for (int j=1; j<=n; j++) {
            f[i][j]|=f[i][k]&&f[k][j];
        }
    }
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
        cin>>n>>m;
        for (int i=0; i<m; i++) {
            int u,v; cin>>u>>v;
            f[u][v]=1;
        }
        floyd();
        int ans=0; 
        for (int i=1; i<=n; i++) {
            bool flag=true;
            for (int j=1; j<=n; j++) if (i!=j && (!f[j][i] && !f[i][j])) {
                flag=false;
                break;
            }
            if (flag) ans++;
        }
        cout<<ans;
        return 0;
    }
    
  • 相关阅读:
    Android开发 使用 adb logcat 显示 Android 日志
    【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410
    C语言 结构体相关 函数 指针 数组
    C语言 命令行参数 函数指针 gdb调试
    C语言 指针数组 多维数组
    Ubuntu 基础操作 基础命令 热键 man手册使用 关机 重启等命令使用
    C语言 内存分配 地址 指针 数组 参数 实例解析
    CRT 环境变量注意事项
    hadoop 输出文件 key val 分隔符
    com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Too many connections
  • 原文地址:https://www.cnblogs.com/wdt1/p/13906467.html
Copyright © 2020-2023  润新知