AtCoder Beginner Contest 139 E题(还未解决)

题意:给出n*(n-1) 的矩阵,第 i 行给出第 i 个人所应对的对手 j
按照从1 ~ n 的顺序出战,每人每天只能打一场。
问所需要的天数;

思路:直接用一个队列模拟整个过程,需要记录上一轮对战的轮数以及当前对战的位置。分别用 ls[] 和 ci[] 来表示

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
int a[N][N],ci[N],ls[N];
int n;
struct node{
    int u,v,w;
    node(int u=0,int v=0,int w=0):u(u),v(v),w(w){}
};
int main(){
    cin >> n;
    for(int i=1;i<=n;++i){
        for(int j=1;j<n;++j){
            cin >> a[i][j];
        }
        ci[i] = 1;  ls[i] = 0;
    }
    int sign = 0;
    int r =0;
    queue<node> q;
    node cur;
    for(int i=1;i<=n;++i){  // 第一轮
        if(ls[i]==1)    continue;
        int  to = a[i][1]; //每个人第一轮的对手
        if(a[to][1]==i){  //如果
            ls[to] = 1; ls[i] = 1;
            q.push({i,to,1});
        }
    }
    while(!q.empty()){
        cur = q.front();    q.pop();    r = cur.w;
// cout << cur.u << ' ' << cur.v << ' ' << cur.w << endl;
        ci[cur.u]++; ci[cur.v]++;
        int to = a[cur.u][ci[cur.u]];
        if(a[to][ci[to]]==cur.u && ls[to]<=cur.w){
            ls[to] = cur.w+1;   ls[cur.u] = cur.w+1;
            q.push(node{cur.u,to,cur.w+1});
        }
        to = a[cur.v][ci[cur.v]];
        if(a[to][ci[to]]==cur.v && ls[to]<=cur.w){
            ls[to] = cur.w+1;   ls[cur.v] = cur.w+1;
            q.push(node{cur.v,to,cur.w+1});
        }
    }
    for(int i=1;i<=n;++i){
        if(ci[i]!=n){
            sign = 1;break;
        }
    }
    if(sign)   cout << -1 << endl;
    else cout << r << endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值