XSY2679 修牆 最短路

2021-08-14 04:35:56 字數 2498 閱讀 4608

有乙個(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 到 ...