時間限制:1 s 記憶體限制:256 mb
這是在阿爾托利亞·潘德拉貢成為英靈前的事情,她正要去拔出石中劍成為亞瑟王,在這之前她要去收集一些寶石。
寶石排列在乙個n*m的網格中,每個網格中有一塊價值為v(i,j)的寶石,阿爾托利亞·潘德拉貢可以選擇自己的起點。
開始時刻為0秒。以下操作,每秒按順序執行
1.在第i秒開始的時候,阿爾托利亞·潘德拉貢在方格(x,y)上,她可以拿走(x,y)中的寶石。
2.在偶數秒,阿爾托利亞·潘德拉貢周圍四格的寶石會消失
3.若阿爾托利亞·潘德拉貢第i秒開始時在方格(x,y)上,則在第i+1秒可以立即移動到(x+1,y),(x,y+1),(x-1,y)或(x,y-1)上,也可以停留在(x,y)上。
求阿爾托利亞·潘德拉貢最多可以獲得多少價值的寶石
第一行給出數字n,m代表行列數.n,m均小於等於100,寶石的價值不會超過10000.下面n行m列用於描述數字矩陣
輸出最多可以拿到多少價值寶石
2 21 2
2 1
4solution:
這個題其實很簡單,我們不用去管如何走,只要取得格仔相容一定會有合法路徑。
有不相容的便想到了最小割,割掉最小不相容的點,獲得最大利益。
先將棋盤黑白染色,將白色的點和s連線,邊權為容量;再將黑色的點和t連線,邊權也是容量。
這時再將所有白色的點和周圍不相容的點連線,邊權為inf。s對於白點就是取,從路徑來說,s-白—黑—t,因為中間部分容量為inf,所以只能割掉兩邊的邊,割掉的就是捨棄的格仔。
1 #include2 #include3 #include4using
namespace
std;
5#define min(a,b) ((a)<(b)?(a):(b))
6#define inf 1e9
7int
read()
14 ch=getchar();15}
16while(ch>='
0'&&ch<='9'
) 20
return s*f;21}
22int n,m,zong,num[105][105],s,t,val[10005],tot,r[10005
],sum;
23bool col[10005
];24
struct
oo c[200005
];27
void add(int x,int y,int
z) 33
void
readandprint() 45}
46 t=zong+1;47
for(int j=1; j<=m; j++)
51for(int i=2; i<=n; i++) 55}
56for(int i=1;i<=n;i++)
62if(col[num[i][j]]) 66}
67}6869
for(int i=1; i<=n; i++)
76if(j80if(i>1
) 84
if(j>1
) 88}89
}90}91
}92int queue[100005],head,tail,deep[10005
];93
bool bfs(int s,int
t) 107
}108
}109
}110
return0;
111}
112int dfs(int opt,int
fw)
116int tmp=fw,k;
117for(int i=r[opt]; ~i; i=c[i].next)
124 c[i].vv-=k;
125 c[i^1].vv+=k;
126 tmp-=k;
127}
128}
129return fw-tmp;
130}
131int dinic(int s,int
t) 136
return
ans;
137}
138int
main()
146int hehe=main();
147int
main()
cogs 2051 王者之劍
這是在阿爾托利亞 潘德拉貢成為英靈前的事情,她正要去拔出石中劍成為亞瑟王,在這之前她要去收集一些寶石。寶石排列在乙個n m的網格中,每個網格中有一塊價值為v i,j 的寶石,阿爾托利亞 潘德拉貢可以選擇自己的起點。開始時刻為0秒。以下操作,每秒按順序執行 1.在第i秒開始的時候,阿爾托利亞 潘德拉貢...
網路流最小割 王者之劍
傳送門 不用考慮走的方法,因為一旦合法,即不同時取相鄰的兩個,一定能達到。所以只用考慮怎麼取就行了。把棋盤黑白染色,s到黑點建權值為val的邊,白點到t建權值為val的邊,然後把相鄰的黑白點建一條為inf的邊。求最小割。不得不提一句 邊從零開始建和從一開始建乙個wa乙個a。時相應的正邊和反邊必須對應...
BZOJ1324 Exca王者之劍
description input 第一行給出數字n,m代表行列數.n,m均小於等於100 下面n行m列用於描述數字矩陣 output 輸出最多可以拿到多少塊寶石 sample input 2 21 2 2 1sample output 4可以發現,所有能取得寶石的點必定是不相鄰的,如果本題點權都為...