hdu1201,hdu6252差分約束系統

2022-05-01 01:39:11 字數 1094 閱讀 4310

題意:有n個限制條件,區間a到b至少是有c個點,求滿足條件的最少端點數

分析:需要滿足所有條件,那麼首先想到的是差分約束系統。先定義陣列g,gi為0到i有gi個端點,那麼條件a到b區間至少有c個端點可以轉化成,gb-g(a-1)>=c

,顯然n個限制條件是不夠的,還需要滿足1>=g(i+1)-g(i)>=0,轉化為,g(i+1)-g(i)>=0和g(i-1)-g(i)>=-1,用這些邊構造乙個圖,然後g(max)即為答案

由於邊的數量比較多,用vector構圖的話會超時,所以用鄰接表加spfa

ac**:

#include #include #include #include #include using namespace std;

const int maxn = 50000+10;

int f[maxn],nex[maxn*3],w[maxn*3],to[maxn*3],cnt;

void add(int x,int y,int k)

bool vis[maxn];

int dis[maxn];

int spaf()}}

// cout<>n;

for(int i=0;i題意:給出的也是限制條件,但是也需要注意乙個限制條件,dis[i]-dis[i-1]>0

ac**:

#include #include #include #include #include using namespace std;

const int maxn=2005;

int f[maxn],w[maxn*3],to[maxn*3],nex[maxn*3];

bool vis[maxn];

int out[maxn],cnt=0,dis[maxn],n,m,k;

void add(int a,int b,int c)

bool spfa()}}

}return true;

}int main()

else

}if(spfa())

else

printf("case #%d: impossible\n",cn);

}return 0;

}

差分約束 hdu 3666

xij ai l bj 0 xij ai u bj 0 兩邊取對數來去除ai,bj前面的係數 有 logbj logai logxij logu logai log bj logl logxij 化成標準差分約束,建圖,spfa,注意乙個竅門,當入隊總數大於2 n m 時就可以輸出no 因為 乙個點...

hdu3592(差分約束)

差分約束 學習鏈結 題意 給一些限制條件,求1到n的最大距離,可轉化成求最短路徑,將不等式化成 的形式 有負邊,要用spfa,不能用dijkstra演算法 如下 include include include include include include include include inclu...

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...