詳細講解
演算法主體:
for
(k=1
;k<=n;k++
)//所有待加入的中轉點
for(i=
1;i<=n;i++
)for
(j=1
;j<=n;j++)if
(e[i]
[j]>e[i]
[k]+e[k]
[j])
e[i]
[j]=e[i]
[k]+e[k]
[j];
題意:每次刪去乙個點,求當前刪去該點之前的所有邊的最小權值和。
解題思路:每次刪去乙個點,直到把所有點都刪盡。倒過來就相當於每次加入乙個點,求加入該點後所有存在邊的最小權值和,相當於floyd的建立過程。所以逆序使用floyd演算法即可,想把所有直接相連的邊存下來,然後每次加入乙個點(要刪除的點),如果邊的兩邊兩點都已經被新增,那麼ans+=path[i][j]
#include
#include
#include
#include
using
namespace std;
#define maxn 510
#define ll long long
const
int inf =
5e7+
100;
int n;
int a[maxn]
[maxn]
;int vis[maxn]
;int del[maxn]
;ll ans[maxn]
;int
main()
}for
(int i=n;i>=
1;i--
)scanf
("%d"
,&del[i]);
ll sum=0;
for(
int k=
1;k<=n;k++)if
(vis[i]
&&vis[j]
) sum+
=a[i]
[j];}}
ans[k]
=sum;
}for
(int i=n;i>
0;i--
)printf
("%i64d "
,ans[i]);
printf
("\n");
return0;
}
題意:從當前所有邊中找出第k小的邊的權值
解題思路:先在當前存在的所有邊中找到前k小的邊進行儲存,因為數值大小可以達到2e5,所以對它們進行離散化處理,然後對這k條邊進行儲存在圖中,然後進行floyd演算法處理,最後找出flyod演算法建立完的圖的第k小的權值邊即可
#include
#include
#include
#include
#include
using
namespace std;
#define ll long long
const ll inf =
1e18
;int n,m,k;
struct nodeedge[
200100];
ll path[
1010][
1010];
vector v;
int sor[
1010];
map<
int,
int> mp;
bool
cmp1
(node a,node b)
intmain()
sort
(edge+
1,edge+
1+m,cmp1)
;int cnt=1;
for(
int i=
1;i<=minv;i++
)sort
(sor+
1,sor+
1+cnt)
;int pos=
unique
(sor+
1,sor+
1+cnt)
-sor-1;
for(
int i=
1;i<=pos;i++
)for
(int i=
1;i<=pos;i++
)for
(int j=
1;j<=pos;j++
) path[i]
[j]=inf;
for(
int i=
1;i<=minv;i++
)for
(int p=
1;p<=pos;p++)}
}}for(
int i=
1;i<=pos;i++
)sort
(v.begin()
,v.end()
);cout<
}
KMP演算法例題 總結
kmp之前沒學,然後排位賽又有一道題考了這個知識點,這題ac了一列人,就差我乙個.kmp演算法 建立乙個next函式,從而使字串匹配的時間複雜度由o n n 變成o n m 舉個例子 ababcab 和 abbbcabdc 首先建立next陣列,next 0 1 ababcab 10012012就是...
Floyd演算法思想
本來 量如此小的演算法不用出模板了,但是的確思想還是很好的。1.定義概覽 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshal...
Floyd演算法簡介
演算法定義 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshall演算法的時間複雜度為o n 3 空間複雜度為o n2 演算法...