有乙個(n
+1)×
(m+1
) 的網格,每條邊都有乙個邊權。有一些格仔是城市。你要用乙個環圈住所有城市,要求環上所有邊的邊權和最小。重合的邊邊權算多次。保證左上角(1
,1) 一定有乙個城市。n,
m≤400
觀察到左上角一定有乙個城市。
首先求出每個城市左上角到(0
,0) 的最短路,那麼這個圈肯定不會經過最短路。如果經過,那麼把其中一部分換成最短路上的邊不會更劣。
這樣每個城市左上角到(0
,0) 的邊都不能被穿過。另外,每個城市周圍四條邊都不能經過。
然後把每個點拆成四個點,每條邊拆成四條邊。如果有一條邊不能穿過,那麼就把這條邊對應的邊刪掉。
最後跑乙個從(0
,0) 右上到(0
,0) 左下的最短路。
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
typedef pair pii;
typedef pairpll;
void sort(int &a,int &b)
void open(const
char *s)
int rd()
while((c=getchar())>='0'&&c<='9');
return s;
}void put(int x)
static
int c[20];
int t=0;
while(x)
while(t)
putchar(c[t--]+'0');
}int upmin(int &a,int b)
return0;}
int upmax(int &a,int b)
return0;}
struct graph
void add(int x,int y,int z)
};graph g;
void add(int x,int y,int z)
ll d[1000010];
int c[1000010];
int b[1000010];
queue q;
void spfa(int s)}}
}int a1[410][410];
int a2[410][410];
int a[410][410];
int n,m;
intid(int x,int y)
pii e[1000010];
int ban[410][410];
int ban2[410][410][5];
void gao2(int x1,int y1,int x2,int y2)
if(y1>y2)
// fprintf(stderr,"%d %d %d %d\n",x1,y1,x2,y2);
if(x2==x1+1)
ban2[x1][y1][3]=ban2[x2][y2][1]=1;
else
ban2[x1][y1][4]=ban2[x2][y2][2]=1;
}void gao(int x,int y,int xx,int yy)
int main()
for(i=0;i<=n;i++)
for(j=0;j<=m;j++)
e[id(i,j)]=pii(i,j);
spfa(1);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j])
ban2[0][0][1]=ban2[0][0][2]=1;
g.init();
for(i=0;i<=n;i++)
for(j=0;j<=m;j++)
if(i)
if(jid(i,j)*4-2,id(i,j+1)*4-3,a2[i][j+1]);
add(id(i,j)*4-1,id(i,j+1)*4,a2[i][j+1]);
}if(j)
if(!ban2[i][j][1])
if(!ban2[i][j][2])
if(!ban2[i][j][3])
if(!ban2[i][j][4])
}spfa(2);
printf("%lld\n",d[4]);
return
0;}
xsy2304 哈 最短路
題目大意 有乙個 n 個點,m 條有向邊的圖,有 q 組詢問。每次詢問 從 a 到 b 經過不超過 c 條邊,且依次經過的邊邊權遞增,問最短路為多少,無解輸出 1。資料範圍 n 150 m 5000 q 1000 我場上並沒有去想正解,打了個spfa居然獲得 90pts 好成績。首先對於經過不超過 ...
XSY1162 鬼計之夜 最短路
給你乙個 n 個點 m條邊的有向圖,有 k 個關鍵點。求一條最短的從乙個關鍵點到另乙個關鍵點的路徑。n,m,k 100000跑k 2 次最短路顯然會tle 考慮兩個不同的數有什麼可以利用的性質。其中會有至少乙個二進位制為不同!所以可以列舉所有二進位制位,從 0 的那邊向 1的那邊跑最短路,再從 1 ...
XSY3370 道路建設 最短路
有乙個完全圖,邊有邊權。對於每個 i 求一棵生成樹,使得 sum n j 到 i 的路徑上邊權最小值 最小。n leq 2000,w leq 9 記最小的邊權 w 這條邊的乙個端點為 s 那麼 i 號點對應的生成樹就是從 i 到 s 的一條路徑,然後經過邊權最小的邊,再連向所有點。可以發現 i 到 ...