structedge{intv,w;};intn,m;vector<edge>e[MAXN];vector<int>L;// 存储拓扑排序结果intmax_dis[MAXN],min_dis[MAXN],in[MAXN];// in 存储每个节点的入度voidtoposort(){// 拓扑排序queue<int>S;memset(in,0,sizeof(in));for(inti=1;i<=n;i++){for(intj=0;j<e[i].size();j++){in[e[i][j].v]++;}}for(inti=1;i<=n;i++)if(in[i]==0)S.push(i);while(!S.empty()){intu=S.front();S.pop();L.push_back(u);for(inti=0;i<e[u].size();i++){if(--in[e[u][i].v]==0){S.push(e[u][i].v);}}}}voiddp(ints){// 以 s 为起点求单源最长(短)路toposort();// 先进行拓扑排序memset(min_dis,0x3f,sizeof(min_dis));memset(max_dis,0,sizeof(max_dis));min_dis[s]=0;for(inti=0;i<L.size();i++){intu=L[i];for(intj=0;j<e[u].size();j++){min_dis[e[u][j].v]=min(min_dis[e[u][j].v],min_dis[u]+e[u][j].w);max_dis[e[u][j].v]=max(max_dis[e[u][j].v],max_dis[u]+e[u][j].w);}}}