42求调 (听取wa一片)

P3366 【模板】最小生成树

hnoi @ 2023-05-07 10:41:26

#include<bits/stdc++.h>
using namespace std;
const int inf=INT_MAX;
struct node {//将每个点出发的所有边以链表存下 
    int v,w,next;//next表示与这个边起点相同的上一条边的编号
}e[5005<<1]; 
int head[5005],dis[5005],cnt,n,m,tot,num=0,mst;
bool vis[5005];
void add(int u,int v,int w){//u为起点 
    e[++cnt].v=v;//终点 
    e[cnt].w=w;//权值 
    e[cnt].next=head[u];//更新以u为起点上一条边的编号 
    head[u]=cnt;//更新以u开头的最后一条边的编号 
}
int prim(){
    int now=1; 
    for(int i=2;i<=n;i++){
        dis[i]=inf;
    }
    for(int i=head[1];i!=0;i=e[i].next){//遍历以i为起点的边(从一顶点开始) 
        dis[e[i].v]=min(e[i].w,dis[e[i].v]);
    }
    while(num<n-1){
        int minn=inf;
        vis[now]=1;
        for(int i=1;i<=n;i++){
            if(minn>dis[i]&&!vis[i]){
                minn=dis[i];
                now=i;
            }
        }
        mst+=minn;
        num++;
        for(int i=head[now];i!=0;i=e[i].next){
            if(dis[e[i].v]>e[i].w&&!vis[e[i].v]) dis[e[i].v]=e[i].w;
        }
    }   
    return mst;
} 
int main(){
    cin>>n>>m;
    int u,v,w;
    for(int i=1;i<=m;i++){
    cin>>u>>v>>w;
    add(u,v,w);
    add(v,u,w);
    }
    if(cnt/2==m) 
    printf("%d",prim());
    else printf("orz");
} 

评测记录


by bamboo12345 @ 2023-05-07 10:45:04

@CHYYDS 首先数组开小了,其次你这判orz跟没判一样


by __er @ 2023-05-07 11:19:47

@CHYYDS orz 判的什么玩意


by hnoi @ 2023-05-07 11:28:26

@bamboo123 大佬这个orz应该怎么判断啊(菜鸡提问)


by bamboo12345 @ 2023-05-07 11:40:25

@CHYYDS 你prim的时候如果当前最小也是 inf 那就是orz啊


|