description
blinker最近喜歡上乙個奇怪的遊戲。
這個遊戲在乙個 n*m 的棋盤上玩,每個格仔有乙個數。每次 blinker 會選擇兩個相鄰
的格仔,並使這兩個數都加上 1。
現在 blinker 想知道最少多少次能使棋盤上的數都變成同乙個數,如果永遠不能變成同
乙個數則輸出-1。
輸入的第一行是乙個整數t,表示輸入資料有t輪遊戲組成。
每輪遊戲的第一行有兩個整數n和m, 分別代表棋盤的行數和列數。
接下來有n行,每行 m個數。
對於每個遊戲輸出最少能使遊戲結束的次數,如果永遠不能變成同乙個數則輸出-1。 2
2 2
1 2
2 3
3 3
1 2 3
2 3 4
4 3 2
2 -1
【資料範圍】
對於30%的資料,保證 t<=10,1<=n,m<=8
對於100%的資料,保證 t<=10,1<=n,m<=40,所有數為正整數且小於1000000000
題解大家去hzwer裡看吧 說的很好
這只留乙個**
1 #include2 #include3 #include4 #include5**#define maxn 1010
6#define ll long long78
using
namespace
std;910
const ll inf=(1ll<<50
);11
12struct
quix ;
17 quix e[20010
];18
19int head[maxn<<1],cur[maxn<<1],tot=1;20
21int t,n,m,src,decc,n1,n2,mx=-1;22
23 ll s1,s2; //
血的教訓 忘了long long
2425
int depth[maxn<<1],a[50][50],color[50][50
];26
27int x[4]=;
28int y[4]=; //
上下左右我竟然少搜了乙個方向
2930 queueq;
3132 inline void read(int&x)
35while(c>='
0'&&c<='
9')
36 x=x*f;37}
3839 inline void add(int x,int
y,ll z)
4546 inline void add_edge(int x,int
y,ll z)
5051 inline int cal(int i,int
j) 54
55bool
bfs() 70}
71}72return
false;73
}7475 ll dfs(int
now,ll flow) 88}
89if(!used) depth[now]=-1;90
return
used;91}
9293
inline ll dinic()
99100 inline bool
check(ll x)
115}
116else add_edge(cal(i,j),decc,x-a[i][j]);
117if(dinic()==cnt) return
true
;118
return
false
;119
}120
121 inline int
hhh()
136if(n1!=n2)
143 printf("
-1\n");
144}
145else
150 ll l=mx,r=inf;
151while(l<=r)
156 printf("
%lld\n
",(ll)l*n1-s1);
157}
158}
159return0;
160}
161162
int sb=hhh();
163int main()
SCOI2012 奇怪的遊戲 網路流
blinker最近喜歡上乙個奇怪的遊戲。這個遊戲在乙個 n m 的棋盤上玩,每個格仔有乙個數。每次 blinker 會選擇兩個相鄰 的格仔,並使這兩個數都加上 1。現在 blinker 想知道最少多少次能使棋盤上的數都變成同乙個數,如果永遠不能變成同 乙個數則輸出 1。輸入的第一行是乙個整數t,表示...
2756 SCOI2012 奇怪的遊戲
time limit 40 sec memory limit 128 mb submit 3052 solved 840 submit status discuss blinker最近喜歡上乙個奇怪的遊戲。這個遊戲在乙個 n m 的棋盤上玩,每個格仔有乙個數。每次 blinker 會選擇兩個相鄰 的...
SCOI2012 二分法 最大流 奇怪的遊戲
這道題初看也許會感覺無法下手,由於每次操作都是相鄰的兩個,所以可以考慮將棋盤黑白染色,這樣我們可以對黑色的格仔和白色的格仔單獨考慮。設黑色格仔個數為cnt1,總和為sum1,白色格仔個數為cnt2,總和為sum2,最終所有格仔都變成了x,則很容易寫出下列的關係式 cnt1 x sum1 cnt2 x...