题意

建出最短路图(DAG)之后就跟这题一样了。

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define mkp make_pair
#define fir first
#define sec second
const int maxn=2*1e5+10;
const int maxm=3*1e5+10;
int n,m,st,ans,cnt;
int ex[maxm],ey[maxm],ew[maxm],head[maxn],dis[maxn],size[maxn],dep[maxn],deg[maxn];
int f[maxn][20];
bool vis[maxn];
struct edge{int to,nxt;}e[maxn];
struct Edge{int to,dis;};
vector<Edge>E[maxn],e1[maxn],e2[maxn];
inline int read()
{
char c=getchar();int res=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')res=res*10+c-'0',c=getchar();
return res*f;
}
inline void add(int u,int v)
{
e[++cnt].nxt=head[u];
head[u]=cnt;
e[cnt].to=v;
}
inline int lca(int x,int y)
{
if(dep[x]>dep[y])swap(x,y);
for(int i=18;~i;i--)if(dep[f[y][i]]>=dep[x])y=f[y][i];
if(x==y)return x;
for(int i=18;~i;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][0];
}
inline void dijstra()
{
memset(dis,0x3f,sizeof(dis));
priority_queue<pii>q;
dis[st]=0;q.push(mkp(0,st));
while(!q.empty())
{
int x=q.top().sec;q.pop();
if(vis[x])continue;
vis[x]=1;
for(unsigned int i=0;i<E[x].size();i++)
{
int y=E[x][i].to;
if(dis[y]>dis[x]+E[x][i].dis)
{
dis[y]=dis[x]+E[x][i].dis;
q.push(mkp(-dis[y],y));
}
}
}
}
inline void topsort()
{
queue<int>q;
q.push(st);dep[st]=1;
while(!q.empty())
{
int x=q.front();q.pop();
for(unsigned int i=0;i<e1[x].size();i++)
{
int y=e1[x][i].to;
deg[y]--;
if(!deg[y])
{
int z=0;
for(unsigned int j=0;j<e2[y].size();j++)z=!z?e2[y][j].to:lca(z,e2[y][j].to);
add(z,y);f[y][0]=z;dep[y]=dep[z]+1;
for(int j=1;j<=18;j++)f[y][j]=f[f[y][j-1]][j-1];
q.push(y);
}
}
}
}
void dfs(int x)
{
size[x]=1;
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
dfs(y);size[x]+=size[y];
}
}
signed main()
{
n=read(),m=read(),st=read();
for(int i=1;i<=m;i++)
{
ex[i]=read(),ey[i]=read(),ew[i]=read();
E[ex[i]].push_back((Edge){ey[i],ew[i]});
E[ey[i]].push_back((Edge){ex[i],ew[i]});
}
dijstra();
for(int i=1;i<=m;i++)
{
if(dis[ex[i]]==dis[ey[i]]+ew[i])swap(ex[i],ey[i]);
if(dis[ey[i]]==dis[ex[i]]+ew[i])e1[ex[i]].push_back((Edge){ey[i],1}),e2[ey[i]].push_back((Edge){ex[i],1}),deg[ey[i]]++;
}
topsort();dfs(st);
for(int i=1;i<=n;i++)if(i!=st)ans=max(ans,size[i]);
printf("%lld",ans);
return 0;
}

最新文章

  1. 八爪鱼招标网的百度权重升为2了,独立IP也从0快速发展为1000
  2. 使用antd UI组件有感
  3. java读取文件之txt文本
  4. 【转载】debian上快速搭建ftp
  5. MySQL表的创建和表中数据操作
  6. Linux下安装最新的Eclipse
  7. 斐波那契数列PHP非递归数组实现
  8. JVM知识学习与巩固
  9. cookie随便写的一点笔记(抄书的)
  10. iOS - 提示信息 - UIAlertView、UIActionSheet、UIAlertController的实际应用
  11. new SqlSessionFactoryBuilder().build(inputStream, properties)
  12. 计算机图形学--旋转变换(java)
  13. HTML center tag
  14. MySQL优化 - 性能分析与查询优化
  15. echarts 折线拐点收藏
  16. webApi添加视图出现/Index.cshtml”处的视图必须派生自 WebViewPage 或 WebViewPage&lt;TModel&gt;。
  17. day84
  18. Out of range value for column &quot;&quot;
  19. Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片
  20. curl 用法总结

热门文章

  1. 201871010111-刘佳华《面向对象程序设计(java)》第一周学习总结
  2. 扩展KMP笔记
  3. 《深度访谈:华为开源数据格式 CarbonData 项目,实现大数据即席查询秒级响应》
  4. shell通配符, 变量, shell作用域
  5. golang数据结构之用循环链表解决约瑟夫环问题
  6. django--中运行scrapy框架
  7. 多网卡做team
  8. 《js高程》笔记总结二(变量,作用域,内存问题)
  9. PVANET: Deep but Lightweight Neural Networks for Real-time Object Detection
  10. Redisson实现分布式锁(1)---原理