2019 JUST Programming Contest 题解

本文提供了2019年JUST Programming Contest的题目解析,涵盖A到K题,其中A、B题作者认为较为简单,C题由于是队友出的,解析不明,D至J题被标记为签到题,K题据队友说是可通过暴力方法解决,而L题解析不详。
摘要由CSDN通过智能技术生成

2019 JUST Programming Contest 题解
#还行

A:还行

#include <bits/stdc++.h>
 
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int M=2e5+10;
int head[N],cnt=1,tot,dfn[N],low[N],num,n,m,c_id[N],head1[N],res[N];
ll ans;
bool qi[N],zhong[N],bridge[M<<1];
char s[N];
struct edge{
    int next,to,w;
}e[M<<2];
void add(int u,int v,int w){
    e[++cnt].next=head[u];
    e[cnt].to=v;
    e[cnt].w=w;
    head[u]=cnt;
}
void tarjan(int u,int in_edge){
    dfn[u]=low[u]=++num;
    for(int i=head[u];i;i=e[i].next){
        int v=e[i].to;
        if(!dfn[v]){
            tarjan(v,i);
            low[u]=min(low[u],low[v]);
            if(dfn[u]<low[v]){
                bridge[i]=bridge[i^1]=true;
            }
        }else if(i!=(in_edge^1))
        low[u]=min(low[u],dfn[v]);
    }
}
void dfs(int u){
    c_id[u]=tot;
    if(qi[u])res[tot]++;
    else if(zhong[u])res[tot]--;
    for(int i=head[u];i;i=e[i].next){
        int v=e[i].to;
        if(c_id[v]||bridge[i])continue;
        dfs(v);
    }
}
void add_c(int u,int v,int w){
    e[++cnt].next=head1[u];
    e[cnt].to=v;
    e[cnt].w=w;
    head1[u]=cnt;
}
void dfs1(int u,int f){
    int now=0;
    for(int i=head1[u];i;i=e[i].next){
        int v=e[i].to,w=e[i].w;
        if(v==f)continue;
        dfs1(v,u);
        int x=abs(res[v]);
        ans+=w*x;now+=res[v];
    }
    res[u]+=now;
}
int main()
{
    int t;scanf("%d",&t);
    while(t--){
        scanf("%d %d",&n,&m);
        tot=num=0;cnt=1;ans=0;
        for(int i=1;i<=n;i++){
            head[i]=head1[i]=low[i]=dfn[i]=res[i]=c_id[i]=0;
            qi[i]=zhong[i]=false;
        }
        scanf(" %s",s+1);
        for(int i=1;i<=n;i++){
            if(s[i]=='H')qi[i]=true;
            else if(s[i]=='A')zhong[i]=true;
        }
        for(int i=1;i<=m;i++){
            int a,b,c;scanf("%d %d %d",&a,&b,&c);
            add(a,b,c);add(b,a,c);
        }
        for(int i=1;i<=cnt;i++)bridge[i]=false;
        for(int i=1;i<=n;i++)
            if(!dfn[i])tarjan(i,0);
        for(int i=1;i<&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值