道路与航线

一道类似缩点的好题,先按道路缩点 然后将缩点以后的图按照航线做DAG

在DAG上先跑topsort 在每一个团内部跑dijkstra,同时更新top点 很有意思的一道题目

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 3e5+10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;

int n,m1,m2,st;

int e[N],ne[N],w[N],h[N],idx;
void add(int a,int b,int c){
	e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx++;
}


int din[N];
int id[N];
vector<int>block[N];
bool df[N];
int cnt;
int dist[N];
bool vis[N];

void dfs(int u,int ids){
	df[u] = true;
	id[u] = ids;
	block[ids].push_back(u);
	
	for(int i=h[u];~i;i=ne[i]){
		int j = e[i];
		if(!df[j])dfs(j,ids);
	} 
}
queue<int>q;
void dijkstra(int ids)
{
	
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>heap;
	for(auto &t:block[ids])heap.push({dist[t],t});
	
	
	while(heap.size()){
		
		auto t = heap.top();heap.pop();
		
		int ver = t.second,distance = t.first;
		
		if(vis[ver])continue;
		vis[ver] = true;
		
		for(int i=h[ver];~i;i=ne[i]){
			int j = e[i];
			//cout<<ver<<" "<<" "<<j<<"\n";
			
			if(dist[j]>distance+w[i]){
				dist[j] = dist[ver]+w[i];
				if(id[j]==id[ver]){
					heap.push({dist[j],j});
				}
			}
			if(id[j]!=id[ver]&&(--din[id[j]]==0))q.push(id[j]);
		}
		
		
	}
	
}

void topsort()
{
	
	for(int i=1;i<=cnt;++i)
	 if(!din[i]){q.push(i);}
	memset(dist,0x3f,sizeof dist);
	memset(vis,0,sizeof vis); 
	dist[st] = 0;
	while(q.size()){
		
		auto t = q.front();
		q.pop();
		//cout<<t<<"??\n";
		dijkstra(t);
		
	}
	
	
}

void solve()
{
	cin>>n>>m1>>m2>>st;
	memset(h,-1,sizeof h);
	for(int i=1;i<=m1;i++){
		int a,b,c;cin>>a>>b>>c;
		add(a,b,c),add(b,a,c);
	}
	
	//缩点
	
	for(int i=1;i<=n;i++)if(!df[i])dfs(i,++cnt);

	
	for(int i=1;i<=m2;i++){
		int a,b,c;cin>>a>>b>>c;
		add(a,b,c);
		din[id[b]]++;
	}
	
	topsort();
	
	
	for(int i=1;i<=n;i++)
	 if(dist[i]>0x3f3f3f3f/2)cout<<"NO PATH\n";
	 else cout<<dist[i]<<"\n";
	
	

}

signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _;
	//cin>>_;
	_ = 1;
	while(_--)solve();
	return 0;
}
相关推荐
GIS数据转换器1 小时前
地下空间综合管廊运营管理平台
大数据·开发语言·人工智能·经验分享·perl
lhbweilai4 小时前
分析FreeRTOS内核对象API的源码实现(四)
c语言·stm32·单片机
Wang's Blog7 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
inrichtt7 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
救救孩子把7 小时前
AI面试八股文-21_21-多模态Agent面试题-Vision-Language-Agent
人工智能·面试·职场和发展·llava·多模态agent
砚底藏山河7 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年7 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym7 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
HPtiger7 小时前
数据结构——选择排序
数据结构·算法·排序算法
康实训7 小时前
老年评估仿真实训平台架构设计与老年人能力评估实训室教学落地实践
大数据·人工智能·算法·实训室·实训室建设