差分約束 C++ 算法例題

差分約束

差分約束 是一種特殊的 n 元一次不等式組,m 個約束條件,可以組成形如下的格式:
{ x 1 ? x 1 ′ ≤ y 1 x 2 ? x 2 ′ ≤ y 2 ? x m ? x m ′ ≤ y m \begin{cases} x_1-x_1^{'} \le y_1 \\ x_2-x_2^{'} \le y_2 \\ \cdots \\ x_m-x_m^{'} \le y_m \end{cases} ? ? ??x1??x1?y1?x2??x2?y2??xm??xm?ym??
我們的任務是需要求出一組解, x 1 = a 1 , x 2 = a 2 , ? , x n = a n x_1=a_1,x_2=a_2,\cdots,x_n=a_n x1?=a1?,x2?=a2?,?,xn?=an?

使得不等式組成立,否則為無解

注意到,每個式子都可以變形為 x i ≤ x i ′ + y i x_i\le x_i^{'}+y_i xi?xi?+yi?

那么就不難想到,圖論中的 三角不等式 ,即為松弛操作

回憶——

if(dis[edge[i].to]>dis[t]+edge[i].w)dis[edge[i].to]=dis[t]+edge[i].w;

雖說它這里是 >,不過也沒有關系,不用考慮

既然知道了,那我們就按照圖論的方法來解:

dis[0]=0 ,并且向著每一個節點連接一條權值為0的邊,運用單源最短路,判斷 負權環 ,若有負權環則為無解,否則依次輸出 dis[i]

提到負權環,就不得不提判斷負權環的大佬算法——SPFA!!!

對于那些不廢 SPFA 的同學們,可以翻到我之前的博客區康康~~

好啦,看模板題——

luoguP5960 [模板]差分約束

AC Code:

#include<bits/stdc++.h>
using namespace std;
int n,m,cntedge;
const int MAXM=5e3+5,inf=65;
struct EDGE{int to,w,pre;
}edge[MAXM<<1];
int head[MAXM];
void add(int from,int to,int w)
{edge[++cntedge].to=to;edge[cntedge].w=w;edge[cntedge].pre=head[from];head[from]=cntedge;return;
}
bool vis[MAXM];
int u,v,w,t;
int dis[MAXM],cnt[MAXM];
queue<int> q;
bool spfa()
{q.push(0);cnt[0]++;vis[0]=true;while(!q.empty()){t=q.front();q.pop();vis[t]=false;for(int i=head[t];i;i=edge[i].pre){if(dis[edge[i].to]>dis[t]+edge[i].w){dis[edge[i].to]=dis[t]+edge[i].w;if(vis[edge[i].to]) continue;q.push(edge[i].to);vis[edge[i].to]=true;if(++cnt[edge[i].to]>=n+1)return false;}}}return true;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) add(0,i,0);for(int i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&w);add(v,u,w);}memset(dis,inf,sizeof(dis));dis[0]=0;if(!spfa())printf("NO\n");else{for(int i=1;i<=n;i++)printf("%d ",dis[i]);printf("\n");}	return 0;
}

AC記錄

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/web/11070.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11070.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11070.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫的要求

本來我是不準備寫數據庫的。而且是準備從零開始&#xff0c;學習python&#xff0c;學完語言學&#xff0c;會c和寫作技法&#xff0c;再來學習數據庫 那樣做的復雜度是天量的&#xff0c;按部就班什么的具備&#xff0c;因為你完全不清楚什么時候就有這個基礎和條件&#xff0…

【53】Camunda8-Zeebe核心引擎-Partitions分區與Internal processing內部處理

Partitions分區 在Zeebe中,所有數據都是基于分區的。(一個)分區本質上是一個關于流程事件的持久化流。在broker集群中,分區分布在節點之間,因此可以將其視為分片。啟動/初始化Zeebe 集群時,用戶可以配置所需的分區數。如果使用過Kafka,這部分內容是比較相似的。 每當部…

SpringBoot集成jxls2實現復雜(多表格)excel導出

核心依賴 需求 導出多個表格&#xff0c;包含圖片&#xff0c;類似商品標簽 1.配置模板 創建一個xlsx的模板文件&#xff0c;配置如下 該模板進行遍歷了兩次&#xff0c;因為我想要導出的數據分為兩列展示&#xff0c;左右布局&#xff0c;一個循環實現不了&#xff0c;所以采…

【ARM64 常見匯編指令學習 20.1 -- ARM 偽指令 .include】

請閱讀【嵌入式開發學習必備專欄】 文章目錄 ARM 編譯指令 .include 使用介紹a.s 文件b.s 文件小結 ARM 編譯指令 .include 使用介紹 在UEFI&#xff08;統一可擴展固件接口&#xff09;開發中&#xff0c;通常會用到匯編語言文件&#xff08;.s 或 .S 文件&#xff09;。如果…

百面算法工程師 | 正則優化函數——BN、LN、Dropout

本文給大家帶來的百面算法工程師是正則優化函數&#xff0c;文章內總結了常見的提問問題&#xff0c;旨在為廣大學子模擬出更貼合實際的面試問答場景。在這篇文章中&#xff0c;我們將總結一些BN、LN、Dropout的相關知識&#xff0c;并提供參考的回答及其理論基礎&#xff0c;以…

Linux kbdconfig命令教程:鍵盤設置與配置(附案例詳解和注意事項)

Linux kbdconfig命令介紹 kbdconfig&#xff08;鍵盤配置&#xff09;是一個用于設置鍵盤類型的程序&#xff0c;提供圖形化的操作界面。kbdconfig實際上是修改/etc/sysconfig/keyboard的鍵盤配置文件。 Linux kbdconfig命令適用的Linux版本 kbdconfig命令主要在Red Hat Lin…

電商秒殺系統-案例04-redis下的session控制

前言&#xff1a; 在現代的Web應用中&#xff0c;安全和高效的用戶身份驗證機制是至關重要的。本文將深入探討基于令牌的用戶登錄會話機制&#xff0c;特別是在使用Redis進行會話管理的情景。通過這一案例實戰&#xff0c;我們將了解令牌如何在用戶身份驗證過程中發揮核心作用&…

Linux dircolors命令教程:如何設置ls命令的顏色方案(附案例詳解和注意事項)

Linux dircolors命令介紹 dircolors命令在Linux中用于設置ls命令顯示文件和目錄的顏色方案。它可以輸出設置LS_COLORS環境變量的命令。 Linux dircolors命令適用的Linux版本 dircolors命令在大多數Linux發行版中都可用&#xff0c;包括Debian、Ubuntu、Alpine、Arch Linux、…

C++ | Leetcode C++題解之第85題最大矩形

題目&#xff1a; 題解&#xff1a; class Solution { public:int maximalRectangle(vector<vector<char>>& matrix) {int m matrix.size();if (m 0) {return 0;}int n matrix[0].size();vector<vector<int>> left(m, vector<int>(n, 0)…

【HCIP學習】BGP對等體組、聚合、路由反射器、聯盟、團體屬性

一、大規模BGP網絡所遇到的問題 BGP對等體眾多&#xff0c;配置繁瑣&#xff0c;維護管理難度大 BGP路由表龐大&#xff0c;對設備性能提出挑戰 IBGP全連接&#xff0c;應用和管理BGP難度增加&#xff0c;鄰居數量過多 路由變化頻繁&#xff0c;導致路由更新頻繁 二、解決大…

使用QT-QSqlQuery::value()遇到的問題

在實現客戶端間好友添加功能時&#xff0c;我通過以下函數想實現數據庫對好友信息的保存 bool OpeDB::handleAddFriend_repound(const char *pername, const char *name) { // pername 被添加方 name 申請添加方 qDebug() << pername << " " &l…

Nginx(簡潔版)

基本配置 worker_processes 1; //默認為1&#xff0c;表示開啟一個業務進程 events //事件驅動模塊&#xff08;&#xff09;{worker_connections 1024; //單個業務進程可接受連接數 } http{include mime.types; // 引入http mime類型&#xff08;在外部已經定義好&#xff0c…

Java數組——冒泡排序

冒泡排序是最出名的排序算法之一&#xff0c;總共有八大排序。 冒泡排序代碼并不復雜&#xff0c;共兩層循環&#xff0c;外層冒泡輪數&#xff0c;里層依次比較。 算法步驟&#xff1a; 1. 比較數組中兩個相鄰元素&#xff0c;如果第一個元素比第二個元素大&#xff0c;交換…

如何在huggingface上申請下載使用llama2/3模型

1. 在對應模型的huggingface頁面上提交申請 搜索對應的模型型號 登錄huggingface&#xff0c;在模型詳情頁面上&#xff0c;找到這個表單&#xff0c;填寫內容&#xff0c;提交申請。需要使用梯子&#xff0c;country填寫梯子的位置吧(比如美國&#xff09; 等待一小時左右…

SEMI啟動SiC專有技術項目

公司鄭重聲明&#xff0c;其正致力于篩選那些能夠穩定輸出、且可重復使用的關鍵參數性能。SEMI&#xff0c;這家SiC領域的佼佼者&#xff0c;已經啟動了一項獨具匠心的專有技術&#xff08;KGD&#xff09;篩選程序。該程序旨在為客戶提供高品質的、經過嚴格電氣分類與光學檢驗…

基于python的旅游爬蟲可視化與實現

摘要 本項目為基于python的旅游爬蟲可視化的設計與實現&#xff0c;項目以Web系統形式展示&#xff0c;利用Xpath爬蟲爬取去哪兒網針對旅游業的需求&#xff0c;對國內熱門旅游景點數據可視化系統&#xff0c;將爬取好的數據保存為CSV文件&#xff0c;再通過ORM框架導入MySQL數…

Python圖形界面(GUI)Tkinter筆記(五):控件的定位(3)

Tkinter(GUI)設計圖形界面時有三種控件的包裝方法去定位各控件在窗口(父容器、根窗口)上的位置。 【1】pack()方法:用方位來定位位置,類似于Word文檔中的文字對齊方式。 【2】grid()方法:用二維表格式的坐標值定位,類似于EXCEL單元格坐標。 【3】place()方法:用窗口…

VUE基礎之,ref屬性,props配置項,mixin(混入)

ref屬性 被用來給元素或子組件注冊引用信息&#xff08;id的替代者&#xff09; 應用在html標簽上獲取的是真實DOM元素&#xff0c;應用在組件標簽上是組件實例對象&#xff08;vc&#xff09; 使用方式&#xff1a; 打標識&#xff1a;<h1 ref"xxx">.....&l…

【python量化交易】qteasy使用教程07——創建更加復雜的自定義交易策略

創建更加復雜的自定義交易策略 使用交易策略類&#xff0c;創建更復雜的自定義策略開始前的準備工作本節的目標繼承Strategy類&#xff0c;創建一個復雜的多因子選股策略策略和回測參數配置&#xff0c;并開始回測 本節回顧 使用交易策略類&#xff0c;創建更復雜的自定義策略 …

Mysql 多表查詢,內外連接

內連接&#xff1a; 隱式內連接 使用sql語句直接進行多表查詢 select 字段列表 from 表1 , 表2 where 條件 … ; 顯式內連接 將‘&#xff0c;’改為 inner join 連接兩個表的 on select 字段列表 from 表1 [ inner ] join 表2 on 連接條件 … ; select emp.id, emp.name, …