幾天做到了最短路的問題,於是隨手放一個最短路的模板
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3;
//如果寫的是0x3f3f3f3f這中形式的話在更新的時候就需要判斷一下是否能到達
//否則不能到達時加一下整形就溢出了 ,不過鏈式向前星存圖存的就是可以到達的//點,多此一舉了
const int inf=99999999;
struct Edge{
int v,c,next;
}edge[maxn*maxn];
int head[maxn],dis[maxn],vis[maxn];
int s,e,tot,n,m;
void init()
{
fill(head,head+maxn,-1);
tot=0;
}
void addedge(int u,int v,int c)
{
edge[tot].c=c;
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void dijkstra()
{
fill(vis,vis+maxn,0);
fill(dis,dis+maxn,inf);
// 如果題目要求求最短路徑, 就加上這一個怕pre數組
// for(int i=0;i<n;i++) pre[i]=i;
//這裏要循環n次,雖然最後一次不需要更新,但也要找最後一個節點
//在這是爲了防止出現圖不連通的情況 ,然後直接break
dis[s]=0;
for(int i=0;i<n;i++)
{
int u=-1,Min=inf;
for(int j=0;j<n;j++)
{
if(!vis[j]&&dis[j]<Min)
{
Min=dis[j];
u=j;
}
}
if(u==-1) break;
vis[u]=1;
for(int j=head[u];j!=-1;j=edge[j].next)
{
int v=edge[j].v;
if(!vis[v]&&dis[v]>dis[u]+edge[j].c)
{
dis[v]=dis[u]+edge[j].c;
//pre[v]=u;
}
}
}
}
稍微修改一下就是最小生成樹的代碼了
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3;
//如果寫的是0x3f3f3f3f這中形式的話在更新的時候就需要判斷一下是否能到達
//否則不能到達時加一下整形就溢出了 ,不過鏈式向前星存圖存的就是可以到達的//點,多此一舉了
const int inf=0x3f3f3f3f;
struct Edge{
int v,c,next;
}edge[maxn*maxn];
int head[maxn],dis[maxn],vis[maxn];
int s,e,tot,n,m;
void init()
{
fill(head,head+maxn,-1);
tot=0;
}
void addedge(int u,int v,int c)
{
edge[tot].c=c;
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
int sum=0;
void dijkstra()
{
fill(vis,vis+maxn,0);
fill(dis,dis+maxn,inf);
//這裏要循環n次,雖然最後一次不需要更新,但也要找最後一個節點
//在這是爲了防止出現圖不連通的情況
dis[s]=0;
for(int i=0;i<n;i++)
{
int u=-1,Min=inf;
for(int j=0;j<n;j++)
{
if(!vis[j]&&dis[j]<Min)
{
Min=dis[j];
u=j;
}
}
if(u==-1) break;
vis[u]=1;
sum+=dis[u];
for(int j=head[u];j!=-1;j=edge[j].next)
{
int v=edge[j].v;
if(!vis[v]&&dis[v]>edge[j].c)
{
dis[v]=edge[j].c;
}
}
}
}