目录
1.prime(邻接矩阵)
const int maxv=1000;
const int inf=100000000;
int n,g[maxv][maxv],d[maxv];
bool vis[maxv]={false};
int prime(int s){
fill(d,d+maxv,inf);
d[0]=0;
int ans=0;
for(int i=0;i<n;i++){
int u=-1,mind=inf;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<mind){
mind=d[j];
u=j;
}
}
if(u==-1) return;
vis[u]=true;
ans+=d[u];
for(int v=0;v<n;v++){
if(vis[v]==false&&g[u][v]!=inf&&g[u][v]<d[v]){
d[v]=g[u][v];
}
}
}
return ans;
}
2.prime(邻接表)
const int maxv=1000;
const int inf=100000000;
struct node{
int v,dis;
};
vector<node> adj[maxv];
int n,d[maxv];
bool vis[maxv]={false};
int prime(){
fill(d,d+maxv,inf);
d[0]=0;
int ans=0;
for(int i=0;i<n;i++){
int u=-1,mind=inf;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<mind){
mind=d[j];
u=j;
}
}
if(u==-1) return;
vis[u]=true;
ans+=d[u];
for(int j=0;j<adj[u].size();j++){
int v=adj[u][j].v;
if(vis[v]==false&&adj[u][v]<d[v]){
d[v]=adj[u][v];
}
}
}
return ans;
}
3.kruskal
const int maxv=110;
const int maxe=10010;
struct edge{
int u,v;
int cost;
}e[maxe];
bool cmp(edge a,edge b){
return a.cost<b.cost;
}
int father[maxv];
int findfather(int x){
int a=x;
while(x!=father[x]){
x=father[x];
}
while(a!=father[a]){
int z=a;
a=father[a];
father[z]=x;
}
return x;
}
int kruskal(int n,int m){
for(int i=0;i<n;i++){
father[i]=i;
}
int ans=0,edgenum=0;
sort(e,e+m,cmp);
for(int i=0;i<m;i++){
int fau=findfather(e[i].u);
int fav=findfather(e[i].v);
if(fau!=fav){
father[fau]=fav;
ans+=e[i].cost;
numedge++;
if(edgenum==n-1) break;
}
}
if(edgenum!=n-1) return -1;
else return ans;
}
4.拓扑排序
bool topologicalsort(){
int num=0;
queue<int> q;
for(int i=0;i<n;i++){
if(indegree[i]==0){
q.push(i);
}
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
indegree[v]--;
if(indegre[v]==0) q.push(v);
}
g[u].clear();
num++;
}
if(num==n) return true;
else return false;
}
5.关键路径
stack<int> toporder;
bool topologicalsort(){
queue<int> q;
for(int i=0;i<n;i++){
if(indegree[i]==0){
q.push(i);
}
}
while(!q.empty()){
int u=q.front();
q.pop();
toporder.push(u);
for(int i=0;i<g[u].size;i++){
int v=g[u][i].v;
indegree[v]--;
if(indegree[v]==0) q.push(v);
if(ve[u]+g[u][i].w>ve[v]){
ve[v]=ve[u]+g[u][i].w;
}
}
}
if(toporder.size()==n) return true;
else return false;
}
int criticalpath(){
memset(ve,0,sizeof(ve));
if(toplogicalsort()==false) return -1;
fill(vl,vl+maxv,ve[n-1]);
while(!toporder.empty()){
int u=toporder.pop();
toporder.pop();
for(int i=0;i<g[u].size;i++){
int v=g[u][i].v;
if(vl[u]>vl[v]-g[u][i].w){
vl[u]=vl[v]-g[u][i].w;
}
}
}
for(int u=0;u<n;u++){
for(int i=0;i<g[u].size;i++){
int v=g[u][i].v,w=g[u][i].w;
int e=ve[u],l=vl[v]-w;
if(e==l){
printf("%d->%d\n",u,v);
}
}
}
return ve[n-1];
}