分析code
第一行有乙個整數n(2<=n<=100),表示有多少個城市。城市的編號是1~n。第二行有乙個整數m(n-1<=m<=n*(n-1)/2,表示有多少條道路。接下來有m行,每行3個整數, x,y,len(1<=x,y<=n,x<>y. 0< len <100)表示城市x和城市y有一條長度為len的雙向道路。再接下來的一行有乙個整數d(1<=d<=m),表示有d條道路破壞了,然後下面有d行,每行兩個整數x,y表示x和y之間的道路被破壞了。 最後一行是兩個整數a,b,表示兩個重要城市a和b的編號。
僅有一行,代表修復道路的最小費用。32
1 2 1
2 3 2
11 2
1 3這其實就是乙個非常簡單的最短路問題,只需要在a和b之間求被破壞道路的最短路。根據原有的道路系統構建無向圖,道路的長度作為無向圖的邊權,由a到b所經過的那些未被破壞的道路其實是不用代價的,可把它們的邊權設為0,注意:不能刪去這些邊,因為我們可以在這些路上走,只是不需要修復它。在這樣乙個圖里,使用dijkstra演算法或spfa(等主流最短路演算法)求a到b的最短路即可
#include#include#include#include#includeusing namespace std;
int n,m,minn=100000000,ans,a[110][110],f[110][110];
bool b[110][110];
void ss(int x,int y)
for (int i=1;i<=f[x][0];i++)
return;
}int main()
scanf("%d",&n);
for (int i=1;i<=n;i++)
int x,y;
scanf("%d%d",&x,&y);
b[x][0]=1;
ss(x,y);
printf("%d\n",minn);
return 0;
}
SPFA 重建道路(jzoj 1212)
有乙個圖,其中的一些路壞了,為了從a走到b,問最少修復多長的路 3 21 2 1 2 3 2 11 2 1 312 n 100 2 leqslant n leqslant 100 2 n 100n 1 d m n n 1 2n 1 leqslant d leqslant m leqslant n n...
P1272 重建道路
p1272 重建道路 題意 有一棵n個點的樹,求刪掉最少的邊數,使得其中p個點的子樹和另一部分分離 dp i j 表示編號為i的點周圍組成j個點的樹最少要刪的邊數 初始狀態 dp i 1 連線這個點的邊數 每個點都是點數為1的樹 然後去考慮連線兩個點,使子樹的點數增多。有兩個點數都是1的樹dp i ...
P1272 重建道路
lin klink link 這道題出的其實挺好的 顯然是乙個樹形dpdp dp問題最開始想複雜了 後來發現很簡單 一直以為是n 3做法 我們用dpu k dp dp u,k 表示在以u uu為根的子樹中,剔除k kk個的最小需要切的邊數 那麼初值就是dpu 1 d uu dp du u dpu,1...