https://www.luogu.com.cn/problem/P4716
#include<bits/stdc++.h>
using namespace std;
const int maxl=2e4+10;
const int inf=1e9+10;
int n,m,rt;
int pre[maxl],ine[maxl],vis[maxl],id[maxl];
struct ed
{
int u,v,w;
}e[maxl];
inline int zhuliu()
{
int ans=0;
while(1)
{
for(int i=1;i<=n;i++) ine[i]=inf;
for(int i=1;i<=m;i++)
{
int u=e[i].u,v=e[i].v;
if(u!=v && e[i].w<ine[v])
ine[v]=e[i].w,pre[v]=u;
}
for(int i=1;i<=n;i++)
if(i!=rt && ine[i]==inf)
return -1;
int cnt=0;
for(int i=1;i<=n;i++)
vis[i]=id[i]=0;
for(int i=1;i<=n;i++)
{
if(i==rt) continue;
ans+=ine[i];
int v=i;
while(vis[v]!=i && !id[v] && v!=rt)// find circle
{
vis[v]=i;
v=pre[v];
}
if(!id[v] && v!=rt)//circle to point
{
id[v]=++cnt;
for(int u=pre[v];u!=v;u=pre[u])
id[u]=cnt;
}
}
if(cnt==0) break;//no circle
for(int i=1;i<=n;i++)
if(!id[i])
id[i]=++cnt;
for(int i=1;i<=m;i++)
{
int u=e[i].u,v=e[i].v;
e[i].u=id[u],e[i].v=id[v];
if(id[u]!=id[v])
e[i].w-=ine[v];
}
rt=id[rt];n=cnt;
}
return ans;
}
int main()
{
scanf("%d%d%d",&n,&m,&rt);
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
e[i]=ed{u,v,w};
}
printf("%d",zhuliu());
return 0;
}