P3905 道路重建

2022-03-09 08:08:04 字數 1957 閱讀 4463

p3905 道路重建

我一開始想錯了,我的是類似kruskal,把毀壞的邊從小到大加,並且判斷聯通性。但是這有乙個問題,你可能會多加,就是這條邊沒用,但是它比較小,你也加上了。

居然還有10分,資料也是水水的。。。

#include#include

#include

#include

#include

#include

#include

#define inf 2147483647

#define for(i,a,b) for(register int i=a;i<=b;i++)

#define p(a) putchar(a)

#define g() getchar()

//by war

using

namespace

std;

intn,m,dd,a,b,x,y,v,t;

int a[110][110

];bool b[110][110

];int d[110

];int

ans;

struct

node

}e[10000

];void

in(int &x)

void o(int

x)int find(int

x)int

main()

in(dd);

for(i,

1,dd)

in(a),in

(b);

for(i,

1,n)

for(j,

1,n)

}sort(e+1,e+t+1

); for(i,

1,t)

}else

}return0;

}

正解是把未壞的邊的權值設成0,壞的邊的值不變,跑spfa即可。

#include#include

#include

#include

#include

#include

#include

#define inf 2147483647

#define len 10010

#define for(i,a,b) for(register int i=a;i<=b;i++)

#define p(a) putchar(a)

#define g() getchar()

using

namespace

std;

intn,m,x,y,v,dd,a,b;

queue

q;int d[110

];bool vis[110],b[110][110

];struct

node

*e[len];

void push(int x,int y,intv)}

void

in(int &x)

while(c<='

9'&&c>='

0')x=x*10+c-'

0',c=g();

x*=y;

}void o(int

x)

if(x>9)o(x/10

); p(x%10+'0'

);}void spfa(int

x) }

else

}p=p->next;

}vis[t]=false

; q.pop();

}}int

main()

in(dd);

for(i,

1,dd)

in(a),in

(b);

spfa(a);

o(d[b]),p(''

);

return0;

}

洛谷P3905 道路重建

此題是顯然的最短路演算法,只是看到一起刪掉的一堆邊感到十分棘手,而且還要求出的是最短新增邊的總長度 但如果仔細觀察就可以發現,我們其實並不用乙個乙個的全部列舉,只需要把新增的邊做最短路就行了。我們可以首先把陣列初始化為乙個較大的數,然後每讀入一條邊,就把此邊的權值記錄,但還要把它清零。為什麼呢?因為...

道路重建 洛谷P3905

題目描述 一場可怕的 後,人們用n個牲口棚 1 n 150,編號1 n 重建了農夫john的牧場。由於人們沒有時間建設多餘的道路,所以現在從乙個牲口棚到另乙個牲口棚的道路是惟一的。因此,牧場運輸系統可以被構建成一棵樹。john想要知道另一次 會造成多嚴重的破壞。有些道路一旦被毀壞,就會使一棵含有p ...

洛谷P3905 道路重建

此題是顯然的最短路演算法,只是看到一起刪掉的一堆邊感到十分棘手,而且還要求出的是最短新增邊的總長度 但如果仔細觀察就可以發現,我們其實並不用乙個乙個的全部列舉,只需要把新增的邊做最短路就行了。我們可以首先把陣列初始化為乙個較大的數,然後每讀入一條邊,就把此邊的權值記錄,但還要把它清零。為什麼呢?因為...