HDU 2433 Travel 最短路樹

2021-07-03 00:12:16 字數 1041 閱讀 4033

題意:給乙個n個點m條邊的無向圖   分別刪除每條邊 問刪除後的新圖中 分別以每個點為原點 到其它點的最短距離之和 圖不連通時輸出inf

思路:如果對於每一條邊刪除後都做n次最短路 則時間複雜度為o(m*n*m*log(n)) 時間複雜度太高 仔細分析一下不難發現 只有刪除的邊是最短路樹上的邊 各點之間的最短距離才會改變 因此 只要列舉最短路樹上的邊 時間複雜度就會降到o(n*n*m*log(n)) 可以接受

我的**效率還是不行... 1903ms險過 - -!

#include #include #include using namespace std;

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

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

#define clr(a, x) memset( a, x, sizeof a )

#define bug puts( "****bug****" )

const int maxn = 100 + 10;

const int maxe = 3000 + 10;

const int inf = 1e5;

struct edge

};struct solve

void add(int u, int v)

int bfs(int s, bool flag)}}

int sum = 0;

rep(i, 0, n) sum += d[i];

return sum;

}void solve()

rep(i, 0, m)

if(cur_sum >= inf) printf("inf\n");

else printf("%d\n", cur_sum);}}

}solver;

int n, m;

void solve()

solver.solve();

}int main()

HDU 2433 Travel 最短路應用

題意 有n個點,m條邊,求依次刪除每一條邊後所有兩點之間的最短路徑的和。思路 先以每乙個頂點為源點求一遍最短路,這樣就形成了n個最短路樹,第i個樹的邊權和為sum i 然後列舉刪除每乙個邊,分別以邊上兩點u v為源點求最短路,如果u v的距離發生變化,則以u為源點時,v節點下的子樹的dis i 都會...

HDU 2433 (最短路BFS 預處理)

讀了個大概跑了個nm2 邊權相等 bfs 這個題暴力nm2,得優化,是n還是m,會發現每次刪邊,刪的是最短路徑的邊,就不用跑bfs,不是,就跑bfs,預處理 nm 不刪邊 nm 列舉 刪邊 n2 m pragma gcc optimize 2 include typedef long long ll...

POJ 3230 Travel(最短路 狀壓DP)

一張 n n 個節點 m role presentation style position relative m m條邊的圖,每個節點代表乙個城市,每條邊代表連線兩個城市,花費一定的路徑 雙向 你選擇了 h h 個城市,現在要這些城市中打工。在第 i role presentation style ...