P3008 [USACO11JAN] Roads and Planes G

P3008

连通块统计后,形成DAG

核心解法

解法深研思未休,

图论算法解绸缪。
负权路径何所惧,
拓扑排序定风流。

cpp 复制代码
/*
解法深研思未休,
图论算法解绸缪。
负权路径何所惧,
拓扑排序定风流。
*/
#include<bits/stdc++.h>
using namespace std;
int INF = 1e9+7; 
int n,r,p,s;
int d[100100];//所属连通块
int dis[100010];
bool vis[100010];
queue<int> t;//拓扑排序 
vector<int> block[25010];//连通块点集 
int pd[100100];//是否为顶点; 
int in[100100],tot;
struct ede{
	int v,w;
	bool operator <(const ede a)const{
		return w > a.w;
	}
};
vector<ede> g[100010];
void dfs(int u,int t) {//染色 
	if(d[u])return;
	d[u] = t; 
	block[t].push_back(u);
	for(ede vis:g[u]){
		int v = vis.v;
		dfs(v,t);
	}
}
void dijk(int s){//对连通块 S 进行dijk
	priority_queue<ede> q;
	for(int v:block[s]){
	 	if(pd[v]){
	 	  //  cout<<" "<<v<<" "<<dis[v]<<endl;
	 		q.push({v,dis[v]});
		}
	}
	while(!q.empty()){
		ede tp = q.top();
		q.pop();
		int u = tp.v;
		if(vis[u])continue;
		vis[u] = 1;
		//cout<<u<<endl;
		for(ede vised:g[u]){
			int v = vised.v,w = vised.w;
			//cout<<u<<" "<<v<<" "<<w<<endl;
			if(dis[v] > dis[u]+w){
				dis[v] = dis[u]+w;
				if(d[v] == d[u]&&!vis[v]){
					q.push({v,dis[v]}); 
				}
				
			}
		}
	}
	
} 
vector<int> b[30001];
void topu(int S){
	for(int i = 1;i <= tot;i++){
		if(in[i] == 0)t.push(i);
	}
	dis[S] = 0;
	pd[S] = 1;
	while(!t.empty()){
		int u = t.front();
		t.pop();
		//cout<<u<<endl;
		dijk(u);
		for(int v:b[u]){
			in[v]--;
			if(in[v] == 0){
				t.push(v);
			}
		}
	}
}
int main(){
	memset(dis,0x3f,sizeof(dis));
	cin>>n>>r>>p>>s;
	for(int i = 1;i <= r;i++){
		int u,v,w;
		cin>>u>>v>>w;
		g[u].push_back({v,w});
		g[v].push_back({u,w});
	}
	for(int i = 1;i <= n;i++){
		if(!d[i]){
			tot++;
			dfs(i,tot);
		}
	}
	for(int i = 1;i <= p;i++){
		int u,v,w;
		cin>>u>>v>>w;
		g[u].push_back({v,w});
		in[d[v]]++;
		pd[v] = 1;
		b[d[u]].push_back({d[v]});
	}
	topu(s);
	for(int i = 1;i <= n;i++){
		if(dis[i] > INF/2){
			cout<<"NO PATH"<<endl;
		}
		else{
			cout<<dis[i]<<endl;
		}
	}
} 
相关推荐
聚客AI12 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v14 小时前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工16 小时前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农18 小时前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了18 小时前
AcWing学习——双指针算法
c++·算法
moonlifesudo19 小时前
322:零钱兑换(三种方法)
算法
NAGNIP2 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队2 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法