1 条题解

  • 0
    @ 2025-5-29 20:56:00
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<ctime>
    #include<algorithm>
    #include<vector>
    #include<string>
    #include<cstring>
    
    #define pb push_back
    
    using namespace std;
    typedef long long ll;
    typedef vector<int> vi;
    typedef vector<vector<int> > vvi;
    typedef vector<ll> vll;
    typedef vector<vector<ll> > vvll;
    
    const int INF = 0x3f3f3f3f;
    
    const int N = 1e3 + 5;
    int dist[N][N];
    vi g[N];
    int n, m, match[N];
    bool vis[N];
    
    struct node {
        ll p, t, d;
    } nodes[N];
    
    bool dfs(int u) {
        for(int i = 0; i < (int)g[u].size(); i++) {
            int v = g[u][i];
            if(vis[v]) continue;
            vis[v] = true;
            if(match[v] == -1 || dfs(match[v])) {
                match[v] = u;
                return true;
            }
        }
        return false;
    }
    
    void solve() {
        for(int i = 1; i <= m; i++) {
            int p, t, d; cin >> p >> t >> d;
            nodes[i].p = p, nodes[i].t = t, nodes[i].d = d;
        }
        for(int i = 1; i <= m; i++) {
            for(int j = 1; j <= m; j++) {
                if(i == j) continue;
                if(dist[nodes[i].p][nodes[j].p] + nodes[i].t + nodes[i].d <= nodes[j].t) 
                    g[i].pb(j); 
            }
        }
        int res = 0;
        memset(match, -1, sizeof(match));
        for(int i = 1; i <= m; i++) { 
            memset(vis, false, sizeof(vis));
            if(dfs(i)) res++; 
        }
        cout << m - res << endl;
    }
    
    int main() {
        ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
        while(cin >> n >> m && n && m) {
            for(int i = 0; i <= m; i++) g[i].clear();
            for(int i = 1; i <= n; i++) {
                for(int j = 1; j <= n; j++) {
                    cin >> dist[i][j];
                    dist[i][j] = (dist[i][j] == -1 ? INF : dist[i][j]); 
                }
            }
            
            for(int k = 1; k <= n; k++) {
                for(int i = 1; i <= n; i++) {
                	if(dist[i][k] >= INF) continue;
                    for(int j = 1; j <= n; j++) {
                        if(dist[k][j] < INF)
                            dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
                    }
                }
            }
            
            solve();
        }
        return 0;
    }
    
    • 1

    信息

    ID
    2217
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    4
    已通过
    1
    上传者