hdu 1384 Intervals (差分約束)

2022-07-09 11:09:11 字數 1315 閱讀 6495

problem - 1384

好歹用了一天,也算是看懂了差分約束的原理,做出第一條查分約束了。

題意是告訴你一些區間中最少有多少元素,最少需要多少個元素才能滿足所有要求。

構圖的方法是,(a)->(b+1)=c。還有就是所有的相鄰的點都要連上(i+1)->(i)=0,(i)->(i+1)=-1。因為我對點離散了,所以就變成(rx[i])->(rx[i+1])=rx[i]-rx[i+1]。

**如下:

1 #include 2 #include 3 #include 4 #include 5 #include 6

7using

namespace

std;89

const

int n = 55555;10

const

int inf = 0x55555555;11

struct

edge

14 edge(int id, int nx, int

val) : id(id), nx(nx), val(val) {}

15 } edge[n << 2

];16

inteh[n], ec;

1718

void

init()

2223

void addedge(int u, int v, int

w) 27

28int rx[n << 1

], dis[n];

29bool

vis[n];

30 queueq;

3132

void spfa(int

s) 50}51

}52}53

54int

main()

66 sort(rx, rx +cnt);

67 cnt = unique(rx, rx + cnt) -rx;

68for (int i = 1; i < cnt; i++) addedge(rx[i], rx[i - 1], rx[i - 1] - rx[i]), addedge(rx[i - 1], rx[i], 0

);69 spfa(rx[0

]);70 printf("

%d\n

", dis[rx[cnt - 1

]]);71}

72return0;

73 }

view code

跑的比較慢,元素進隊的次數比較多。用固定大小的queue因為越界wa了好多次。

——written by lyon

HDU 1384 差分約束

要求選取乙個最小的集合,集合中的數滿足n個條件,每個條件 在區間 ai,bi 內至少有ci個數備選在了集合裡。差分約束,設sum i 表示在i 1中選取到集合中的數的個數,那麼題目的要求就可以描述為如下的關係 sum a sum b 1 c sum i sum i 1 0 sum i 1 sum i...

hdu 1384 spfa 差分約束

可能是因為太累了吧,早上6點睡的,spfa居然乙個vis陣列敲錯了!wa了好久。還是要多敲。細心 冷靜 這題是差分約束題,一般的差分約束是先轉換為圖,然後用spfa求其中的最短路 長的一b,沒怎麼看,我自己試著搞了搞,同樣的把這些不等式轉換為圖,然後求的不是最短路而是最長路 而且我的圖里的權值除了回...

Intervals(差分約束)

題意 給出n個整數區間 ai,bi 並且給出乙個約束ci,1 ci bi ai 1 使得陣列z在區間 ai,bj 的個數 ci個,求出陣列z的最小長度。思路 建立差分約束系統。因為這裡要求陣列長度的最小值,要變為x y k的標準形式。設陣列 s j 表示陣列 z 區間 0,j 裡包含的元素個數。所以...