社区讨论
(强连通水紫)萌新求救
CF467D Fedor and Essay参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo2c1ckv
- 此快照首次捕获于
- 2023/10/23 11:22 2 年前
- 此快照最后确认于
- 2023/11/03 11:31 2 年前
蒟蒻调了一上午了~~(0v0)~~
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dfn[600005],low[600005],dep,lf[600005];
bool visitt[600005];//q即桥
int color[600005],ct=0,bl[600005];
int nnext[600005],tto[600005],edge[600005],sta[600005],llast[600005],ttot=0;
void add(int inn,int jnn)
{
nnext[++ttot]=llast[inn];
sta[ttot]=inn;
tto[ttot]=jnn;
llast[inn]=ttot;
}//建图
int nxt[600005],nto[600005],nedge[600005],nsta[600005],nlast[600005],ntot=0;
void nadd(int inn,int jnn)
{
nxt[++ttot]=nlast[inn];
nsta[ttot]=inn;
nto[ttot]=jnn;
nlast[inn]=ttot;
}//建图
vector <int> vv[500005];
int num[600005],bn[600005],am[600005],br[600005];
int zhan[600005],tail=0;
bool iz[600005];
int rnum[600005],nnum[600005];
void tarjan(int u, int fa)
{
if(dfn[u]) return;
low[u] = dfn[u] = ++dep;
zhan[++tail] = u;
iz[u]=1;
for(int i = llast[u]; i; i = nnext[i])
{
if(!visitt[i])
{
tarjan(tto[i],u);
if(iz[tto[i]])
low[u]=min(low[u],low[tto[i]]);
}
}
if(dfn[u]==low[u])
{
ct++;
while(zhan[tail+1]!=u)
{
vv[ct].push_back(zhan[tail]);
iz[zhan[tail]]=0;
bl[zhan[tail]]=ct;
if(br[ct]>rnum[zhan[tail]])
{
br[ct]=rnum[zhan[tail]];
bn[ct]=nnum[zhan[tail]];
}
if(bn[ct]>nnum[zhan[tail]])
bn[ct]=nnum[zhan[tail]];
color[zhan[tail--]]=ct;
}
}
}//经典tarjan
int n;
int ansa,ansb;
bool got[600005];
void dfs(int x)
{
if(got[x]) return;
got[x]=1;
for(int i=nlast[x]; i; i=nxt[i])
{
dfs(nto[i]);
if(br[x]>br[nto[i]])
{
br[x]=br[nto[i]];
bn[x]=bn[nto[i]];
}
if(bn[x]>bn[nto[i]])
bn[x]=bn[nto[i]];
}
}
int rd[600005];
map <string,bool> apd;
map <string,int> apn;
int now=0;
string lw[600005];
signed main()
{
memset(bn,127,sizeof(bn));
memset(br,127,sizeof(br));
string inn,jnn;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>inn;
for(int j=0; j<inn.size(); j++)
{
if(inn[j]>'Z')
inn[j]-=32;//全部转为大写
}
lw[i]=inn;//原论文备用
if(!apd[inn])
{
apd[inn]=1;
apn[inn]=++now;
for(int j=0; j<inn.size(); j++)
if(inn[j]=='R')
rnum[apn[inn]]++;
nnum[apn[inn]]=inn.size();
}
}
int m;
cin>>m;
for(int i=1; i<=m; i++)
{
cin>>inn>>jnn;
for(int j=0; j<inn.size(); j++)
if(inn[j]>'Z')
inn[j]-=32;//全部转为大写
for(int j=0; j<jnn.size(); j++)
if(jnn[j]>'Z')
jnn[j]-=32;//全部转为大写
if(!apd[inn])
{
apd[inn]=1;
apn[inn]=++now;
for(int j=0; j<inn.size(); j++)
if(inn[j]=='R')
rnum[apn[inn]]++;
nnum[apn[inn]]=inn.size();
}
if(!apd[jnn])
{
apd[jnn]=1;
apn[jnn]=++now;
for(int j=0; j<jnn.size(); j++)
if(jnn[j]=='R')
rnum[apn[jnn]]++;
nnum[apn[jnn]]=jnn.size();
}
add(apn[inn],apn[jnn]);
}
for(int i=1; i<=now; i++)
if(!dfn[i])
tarjan(i,0);
// for(int i=1; i<=now; i++)
// cout<<bn[bl[i]]<<" "<<br[bl[i]]<<endl;
for(int i=1; i<=m; i++)
if(bl[sta[i]]!=bl[tto[i]])
nadd(bl[sta[i]],bl[tto[i]]);
long long num=0;
for(int i=1; i<=n; i++)
{
dfs(bl[apn[lw[i]]]);
//cout<<br[bl[apn[lw[i]]]]<<" "<<bn[bl[apn[lw[i]]]]<<endl;
ansa+=br[bl[apn[lw[i]]]];
ansb+=bn[bl[apn[lw[i]]]];
}
cout<<ansa<<" "<<ansb;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...