社区讨论

站外题求助

题目总版参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mmefq2jj
此快照首次捕获于
2026/03/06 13:09
4 天前
此快照最后确认于
2026/03/07 22:30
3 天前
查看原帖
调了 n 小时,没调出来,问了AI也没调出来。

Problem G: 铁路运费

Time Limit: 1 Sec Memory Limit: 128 MB

Description

CSSYZ国有N个城市,依次编号为1, 2, …, N。城市1是CSSYZ国的首都。该国的铁路公司只有1家,由FYT垄断经营,FYT公司运营着M条路线。路线被编号为1, 2, …, M,第i条线路(1<=i<=M)双向连接着城市Ui和城市Vi。城市间的移动方式只有铁路。任意两个城市之间都能通过若干条铁路互通,即任意两个城市之间,直接连接的路线最多只有1条;对于任一城市,从该市总是可以通过若干条路线到达城市1。
现在所有路线的运费都是1元。陷于经营困境的FYT计划在今后Q年间提高若干条路线的运费。在这个计划里,第j年(1<=j<=Q)的年初将把路线Rj的运费从1元提升到2元。被提价过一次的路线的运费将一直是2元,不会再次提价。此外,FYT的铁路公司每年还会调查每个城市的市民的满意度。计划开始前,每个城市的市民都表示满意,但提价之后,可能会出现表示不满的市民。每年的满意度调查都在当年的提价完成之后进行。所以进行第j年(1<=j<=Q)的满意度调查时,路线R1, R2, …, Rj的运费提升已经完成,此外的路线还没有被提价。第j年的满意度调查里,如果城市k(2<=k<=N)的市民从城市k到首都城市1的费用的最小值比计划开始前的最小费用要高,则会对铁路公司表示不满。
如果路线经过多条铁路,费用是各条路线的运费的和。城市1的市民不会对铁路公司表示不满。另外请注意,提价后获得最小费用要使用的路线可能跟计划开始前的不一样。在整个计划开始之前,对于今后Q年间市民的满意度调查,FYT希望计算存在不满市民的城市个数。请写出一个程序,给定CSSYZ国的铁路路线信息和提价计划,输出每次满意度调查里存在不满市民的城市个数。

Input

第一行为3个用空格隔开的整数N, M, Q。N为城市个数,M为路线条数,Q为提价计划的执行年数。
接下来M行中第i行(1<=i<=M)为两个用空格隔开的整数Ui, Vi,表示第i条路线连接着城市Ui和Vi。
接下来Q行中第j行(1<=j<=Q)为整数Rj,表示计划的第j年将提升路线Rj的运费。

Output

输出Q行,第j行(1<=j<=Q)表示第j年的满意度调查中存在不满市民的城市个数。

Sample Input

CPP
【输入样例15 6 5
1 2
1 3
4 2
3 2
2 5
5 3
5
2
4
1
3
【输入样例24 6 6
1 2
1 3
1 4
2 3
2 4
3 4
1
4
2
5
3
6

Sample Output

CPP
【输出样例10
2
2
4
4
【输出样例21
1
2
2
3
3

【数据范围】

25%的数据满足:N<=100,M<=4 950,Q<=30;
50%的数据满足:Q<=30;
75%的数据满足:输出结果里出现的不同数最多50种;
100%的数据满足:2 ≦ N ≦ 100 000,1 ≦ Q ≦ M ≦ 200 000,1 ≦ Ui ≦ N,
1 ≦ Vi ≦ N,Ui != Vi ,1 ≦ Rj ≦ M,Rj != Rk (1 ≦ j < k ≦ Q)。

代码

CPP
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const int maxm=2e5+5;
pair<int,int> e[maxm];
vector<int> g[maxn],temp;
vector<pair<int,int>> ge[maxn];
int n,m,q,d[maxn],fa[maxn],qq[maxm],num,sz[maxn];
bool k[maxm],is[maxm];
int find(int x){
    if(fa[x]==x)return x;
    fa[x]=find(fa[x]);
    return fa[x];
}
int add(int x,int y){
    int fx=find(x),fy=find(y);
    if(fx==fy)return 0;
    bool px=(fx==find(1)),py=(fy==find(1));
    int cnt=0;
    if(px&&!py)cnt=sz[fy];
    if(!px&&py)cnt=sz[fx];
    fa[fx]=fy;
    sz[fy]+=sz[fx];
    return cnt;
}
void bfs(){
    queue<int> q;
    memset(d,-1,sizeof(d));
    d[1]=0;
    q.push(1);
    while(q.size()){
        int u=q.front();q.pop();
        for(int i=0;i<g[u].size();i++){
            int v=g[u][i];
            if(d[v]==-1)d[v]=d[u]+1,q.push(v);
        }
    }
}
int main(){
    scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=m;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        e[i]={u,v};
        g[u].push_back(v);
        g[v].push_back(u);
    }
    bfs();
    for(int i=1;i<=m;i++){
        int u=e[i].first,v=e[i].second;
        if(d[u]+1==d[v]||d[v]+1==d[u]){
            k[i]=1;
            ge[u].push_back({v,i});
            ge[v].push_back({u,i});
        }
    }
    for(int i=1;i<=q;i++){
        scanf("%d",&qq[i]);
        is[qq[i]]=1;
    }
    for(int i=1;i<=n;i++)fa[i]=i,sz[i]=1;
    for(int i=1;i<=m;i++)if(!is[i])add(e[i].first,e[i].second);
    for(int i=2;i<=n;i++)if(find(i)==find(1))num++;
    temp.push_back(n-1-num);
    for(int i=q;i>=2;i--){
        int id=qq[i];
        if(k[id])num+=add(e[id].first,e[id].second);
        temp.push_back(n-1-num);
    }
    reverse(temp.begin(),temp.end());
    for(int i=0;i<q;i++)printf("%d\n",temp[i]);
    return 0;
}

回复

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

正在加载回复...