社区讨论

怎么会RE的?我在ACWING上AC了

P1948[USACO08JAN] Telephone Lines S参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lupslzxn
此快照首次捕获于
2024/04/08 01:23
2 年前
此快照最后确认于
2024/04/08 15:56
2 年前
查看原帖
CPP

//
//  main.cpp
//  1
//
//  Created by X on 2024/4/6.
//

#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f
using namespace std;

int n,m,k;

const int N = 1001;
int A[N][N];
int B[N][N];

bool check(int mid){
    for (int i=1; i<=n; i++) {
        for (int j=1; j<=n; j++) {
            B[i][j]=A[i][j];
        }
    }
    for (int i=1; i<=n; i++) {
        for (int j=1; j<=n; j++) {
            if(B[i][j]==inf) continue;
            else if (B[i][j]<mid) B[i][j]=0;
            else B[i][j]=1;
        }
    }
    bool vis[1001]={0};
    int dis[1001]={0};
    for (int i=2; i<=n; i++) dis[i]=inf;
    for (int i=1; i<=n; i++) {
        int cnt=-1;
        int _min=inf;
        for (int j=1; j<=n; j++) {
            if(_min>dis[j]&&!vis[j]){
                cnt=j;
                _min=dis[j];
            }
        }
        vis[cnt]=1;
        for (int j=1; j<=n; j++) {
            dis[j]=min(dis[j],dis[cnt]+B[cnt][j]);
        }
    }
    return dis[n]>k;
}

//1到n的最短路径里面的第k跳最短
signed main() {
    cin>>n>>m>>k;
    for (int i=1; i<=1000; i++) {
        for (int j=1; j<=1000; j++) {
            A[i][j]=inf;
        }
    }
    for (int i=1; i<=m; i++) {
        int x,y,z;
        cin>>x>>y>>z;
        A[x][y]=min(A[x][y],z);
        A[y][x]=min(A[y][x],z);
    }
    int l=0,r=1000005;
    while (l<r) {
        int mid=(l+r+1)/2;
        if(check(mid)){
            l=mid;
        }
        else{
            r=mid-1;
        }
    }
    if (l==1000005) {
        cout<<"-1"<<endl;
    }
    else cout<<l<<endl;
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...