ÕâµÀÌâÊdz¤É³ÑûÇëÈüµÄÌ⣬µ±Ê±ÊǵÀÇ©µ½Ìâ¡£
ÕâÖÖÌ⻹ÊǺܳ£¼ûµÄ£¬½²Ò»ÏÂ˼·¡£
Ê×ÏÈÊÇÔ¤´¦Àí³öÿ¸ö±¦²ØÖ®¼äµÄ¾àÀ룬»¹Óе½±ßµÄ¾àÀ룬ֱ½Ó¶Ôÿ¸ö±¦²Ø½øÐÐÒ»´ÎSPFA¾Í¿ÉÒÔÁË¡£
È»ºó¾ÍÊǾµäµÄÇóTSPµÄ¹ý³Ì¡£
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Max 2505
#define FI first
#define SE second
#define ll long long
#define PI acos£¨-1.0£©
#define inf 1111111111
#define LL£¨x£© £¨ x ¡¶ 1 £©
#define bug puts£¨"here"£©
#define PII pair<int,int>
#define RR£¨x£© £¨ x ¡¶ 1 | 1 £©
#define mp£¨a,b£© make_pair£¨a,b£©
#define mem£¨a,b£© memset£¨a,b,sizeof£¨a£©£©
#define infA£¨a£© for £¨int i = 0 ; i <= n ; ++ i£©a[i] = inf ;
#define REP£¨i,s,t£© for£¨ int i = £¨ s £© ; i <= £¨ t £© ; ++ i £©
using namespace std;
inline void RD£¨int &ret£© {
char c;
do {
c = getchar£¨£©£»
} while£¨c < '0' || c > '9'£© ;
ret = c - '0';
while£¨£¨c=getchar£¨£©£© >= '0' && c <= '9'£©
ret = ret * 10 + £¨ c - '0' £©£»
}
inline void OT£¨int a£© {
if£¨a >= 10£©OT£¨a / 10£© ;
putchar£¨a % 10 + '0'£© ;
}
#define N 222
#define K 15
int Map[N][N] ;
struct tru {
int x ,y ;
} tk[K] ;
int tt ;
int MM[K][K] ;
int dp[1 ¡¶ K][K] ;
int dis[N][N] ;
bool vis[N][N] ;
PII qe[1111111] ;
int D[K] ;
int n , m ;
int mx = {0 , 0 , 1 , -1} ;
int my = {1 , -1 , 0 , 0} ;
int inmap£¨int x ,int y£© {
if£¨x >= 0 && x < n && y >= 0 && y < m && Map[x][y] != -1£©return 1 ;
return 0 ;
}
void init£¨int pos£© {
for £¨int i = 0 ; i < n ; i ++ £© {
for £¨int j = 0 ; j < m ; j ++ £© {
dis[i][j] = inf ;
vis[i][j] = 0 ;
}
}
dis[tk[pos].x][tk[pos].y] = Map[tk[pos].x][tk[pos].y] == -1 inf : 0 ;
int h = 0 , t = 0 ;
qe[h ++ ] = mp£¨tk[pos].x ,tk[pos].y£© ;
while£¨h > t£© {
PII tp = qe[t ++ ] ;
vis[tp.FI][tp.SE] = 0 ;
if£¨tp.FI == 0 || tp.FI == n - 1 || tp.SE == 0 || tp.SE == m - 1£© {
D[pos] = min£¨D[pos] , dis[tp.FI][tp.SE]£© ;
}
for £¨int i = 0 ; i < 4 ; i ++ £© {
int tx = tp.FI + mx[i] ;
int ty = tp.SE + my[i] ;
if£¨inmap£¨tx , ty£©£© {
if£¨dis[tx][ty] > dis[tp.FI][tp.SE] + Map[tx][ty]£© {
dis[tx][ty] = dis[tp.FI][tp.SE] + Map[tx][ty] ;
if£¨£¡vis[tx][ty]£© {
vis[tx][ty] = 1 ;
qe[h ++ ] = mp£¨tx ,ty£© ;
}
}
}
}
}
}
int main£¨£© {
#ifndef ONLINE_JUDGE
freopen£¨"in.txt","r",stdin£© ;
freopen£¨"out.txt","w",stdout£© ;