同样代码O1只有65,吸氧100,
不要在意我强行插入的Kruskal算法
#include <bits/stdc++.h>
using namespace std;
const int maxn=210,maxm=6e3+10,inf=0x3f3f3f3f;
int Head[maxn],Next[maxm<<1],to[maxm<<1],w[maxm<<1],tot;
int ans,dis[maxn],n,cnt,week;
struct node{
int pos,dis;
};
priority_queue<node> q;
bool vis[maxn];
bool operator<(node a,node b){
return a.dis>b.dis;
}
struct node2{
int u,v,d,day;
}E[maxm<<1];
bool operator<(node2 a,node2 b){
return a.d<b.d;
}
void add(int u,int v,int d){
++tot;
Next[tot]=Head[u];
Head[u]=tot;
to[tot]=v;
w[tot]=d;
}
int dij(){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
while(!q.empty())q.pop();
cnt=ans=0;
q.push((node){1,0});dis[1]=0;
while(!q.empty()){
node tmp=q.top();q.pop();
int u=tmp.pos;
if(vis[u])continue;
vis[u]=1;ans+=tmp.dis;cnt++;
for(int i=Head[u];i;i=Next[i]){
int v=to[i];
if(dis[v]>w[i]){
dis[v]=w[i];
q.push((node){v,dis[v]});
}
}
}
if(cnt<=n-1)return -1;
else return ans;
}
int fa[maxn];
int Find(int x){
if(x!=fa[x])return fa[x]=Find(fa[x]);
return x;
}
bool query(int x,int y){
x=Find(x);y=Find(y);
if(x==y)return 0;
fa[x]=y;
return 1;
}
int kru(int dd){
cnt=ans=0;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=week;i++)if(E[i].day<=dd&&query(E[i].u,E[i].v)){
cnt++;ans+=E[i].d;
}
if(cnt<n-1)return -1;
else return ans;
}
int main()
{
scanf("%d%d",&n,&week);
for(int i=1;i<=week;i++){
int u,v,d;scanf("%d%d%d",&u,&v,&d);
add(u,v,d);add(v,u,d);
E[i]=(node2){u,v,d,i};
printf("%d\n",dij());
}
// sort(E+1,E+1+week);
// for(int i=1;i<=week;i++)printf("%d\n",kru(i));
return 0;
}