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<&#