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 6view code7using
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 }
跑的比較慢,元素進隊的次數比較多。用固定大小的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 裡包含的元素個數。所以...