題意:給乙個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 ...