求助大佬,这个怎么写错了?

P3366 【模板】最小生成树

双 线 程 做 题
by 警策看取 @ 2020-08-04 13:59:06


@[xiaolaoshu](/user/327971) 要不把题目都发出来让大家调算了,还不会棕
by Linune_Gump @ 2020-08-04 13:59:31


显然两帖题目、代码都不同,lz是积攒着一起发的,没毛病
by xiaolaoshu @ 2020-08-04 13:59:51


@[xiaolaoshu](/user/327971) 你没看到,他前面还发了一个最小生成树的
by Implicit @ 2020-08-04 14:00:52


哦,我只看见一个线段树的
by xiaolaoshu @ 2020-08-04 14:02:57


主页双帖 危
by 百因必有AC @ 2020-08-04 14:05:57


主页双帖 危。
by 血色黄昏 @ 2020-08-04 14:08:40


主页双帖 危
by _Rainlzy @ 2020-08-04 14:12:03


@[yhc12345](/user/141577)
by JK_LOVER @ 2020-08-04 14:30:48


```cpp #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<queue> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; int n,m; const int N=5010,M=2e5+10; struct Edge { int v,w,nxt; }e[M<<1]; int head[N],ne; int lc[N]; bool vis[N]; void init() { memset(head,-1,sizeof(head)); ne=0; } void add_edge(int u,int v,int w) { e[++ne].v=v; e[ne].w=w; e[ne].nxt=head[u]; head[u]=ne; } struct Node { int id,lc; Node(int _id,int _lc) { id=_id; lc=_lc; } bool operator<(const Node a) const{ return lc > a.lc; } }; priority_queue<Node> pq; bool flag=true; int ans; void prim() { memset(lc,0x3f,sizeof(lc)); lc[1]=0; vis[1]=true; for(int i=head[1];i!=-1;i=e[i].nxt) { if(lc[e[i].v]>lc[1]+e[i].w) { lc[e[i].v]=lc[1]+e[i].w; pq.push(Node(e[i].v,lc[e[i].v])); } } for(int i=1;i<n;i++) { int k=-1; while(!pq.empty()) { k=pq.top().id;pq.pop(); if(!vis[k]) break; } if(k==-1) { flag=false; break; } vis[k]=true; ans+=lc[k]; lc[k] = 0;//重要 // cout<<"id"<<k<<" lc[k] : " <<lc[k]<<endl; for(int i=head[k];i!=-1;i=e[i].nxt) { if(!vis[e[i].v]&&lc[e[i].v]>lc[k]+e[i].w) { lc[e[i].v]=lc[k]+e[i].w; pq.push(Node(e[i].v,lc[e[i].v])); } } } } int main() { init(); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add_edge(u,v,w); add_edge(v,u,w); } prim(); if(!flag) { printf("orz"); } else { printf("%d\n",ans); } return 0; } ```
by JK_LOVER @ 2020-08-04 14:31:00


上一页 | 下一页