P1993 小K的農場 差分約束

2022-05-01 16:15:12 字數 3322 閱讀 8842

小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊(共m個),以下列三種形式描述:

但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。

輸入格式:

第一行包括兩個整數 n 和 m,分別表示農場數目和小 k 記憶中的資訊數目。

接下來 m 行:

如果每行的第乙個數是 1,接下來有 3 個整數 a,b,c,表示農場 a 比農場 b 至少多種植了 c 個單位的作物。

如果每行的第乙個數是 2,接下來有 3 個整數 a,b,c,表示農場 a 比農場 b 至多多種植了 c 個單位的作物。如果每行的第乙個數是 3,接下來有 2 個整數 a,b,表示農場 a 種植的的數量和 b 一樣多。

輸出格式:

如果存在某種情況與小 k 的記憶吻合,輸出「yes」,否則輸出「no」。

輸入樣例#1: 複製

3 3

3 1 2

1 1 3 1

2 2 3 2

輸出樣例#1: 複製

yes
對於 100% 的資料保證:1 ≤ n,m,a,b,c ≤ 10000。

很明顯的一道最長路   邊也很好建

但是普通的spfa會超時 

用dfs的spfa

最長路:  最長路的超級源點權值取0

#includeusing

namespace

std;

//input by bxd

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ri(n) scanf("%d",&(n))

#define rii(n,m) scanf("%d%d",&n,&m)

#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)

#define rs(s) scanf("%s",s);

#define ll long long

#define pb push_back

#define rep(i,n) for(int i=0;i

#define clr(a,v) memset(a,v,sizeof a)

/////////////////////////////////

/#define inf 0x3f3f3f3

const

int n=1000000+5

;const

int m=10*n;

intn;

intpos,head[m];

struct

edge

edge[m];

void add(int a,int b,int

c)int

dis[n];

intvis[n];

intcnt[n];

/*bool spfa()}}

}return true;}*/

bool spfa(int

u) }

vis[u]=0

;

return1;

}int

main()

else

if(x==2

)

else

}rep(i,

1,n)

add(

0,i,0),dis[i]=-inf;

if(spfa(0

)) printf(

"yes");

else printf("no"

);

return0;

}

view code

最短路寫法有個奇怪的地方   連源點的時候居然和最長路的寫法一樣

可能是超級源點都是要往外部連的?

超級源點的權值可以任意 正數

#includeusing

namespace

std;

//input by bxd

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ri(n) scanf("%d",&(n))

#define rii(n,m) scanf("%d%d",&n,&m)

#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)

#define rs(s) scanf("%s",s);

#define ll long long

#define pb push_back

#define rep(i,n) for(int i=0;i

#define clr(a,v) memset(a,v,sizeof a)

/////////////////////////////////

/#define inf 0x3f3f3f3

const

int n=1000000+5

;const

int m=10*n;

intn;

intpos,head[m];

struct

edge

edge[m];

void add(int a,int b,int

c)int

dis[n];

intvis[n];

intcnt[n];

/*bool spfa()}}

}return true;}*/

bool spfa(int

u) }

vis[u]=0

;

return1;

}int

main()

else

if(x==2

)

else

}rep(i,

1,n)

add(

0,i,0),dis[i]=inf;//

add(i,0,0)反而會錯

if(spfa(0

)) printf(

"yes");

else printf("no"

);

return0;

}

view code

此外既然這題傳統spfa超時的話

可以判斷強連通 tarjan  判斷強連通裡面的權值是否為負數!!!!!!

P1993 小K的農場(差分約束)

小k的農場 題目描述 小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 農場a比農場b至少多種植了c個單位的作物,農場a比農場b至多多種植了c個單位的作物,農場a與農場b種植的作物數一樣多。但是,由於小...

差分約束 P1993 小 K 的農場

建立乙個超級源點s,使得dis x dis i 然後就可以建邊 a b 可以拆成b a 之後再跑spfa,判斷是否有負環,有負環則說明不能滿足,無負環則能滿足 includeusing namespace std const int maxm 5005 const int inf 0x3f3f3f3...

洛谷P1993 小K的農場 差分約束

對於n nn個物品,給出m mm個限制關係,分別是 1.a aa比b bb至少多種c cc單位的作物。2.a aa比b bb至多多種c cc單位的作物。3.a aa和b bb的作物數相等。求問是否滿足這樣的一種情形,符合所有的限制關係。不妨記f f f 表示 的作物數,顯然各條件等價於 1.f a ...