一开始用的邻接矩阵,提交之后全是WA,改成邻接表可以AC,看来数据稍微大一点还是邻接表更稳;下面第一段是AC代码用的邻接表,第二段用的邻接矩阵,样例结果跑出来是对的,但是提交之后是错的
#include<bits/stdc++.h>
using namespace std;
const int MAXV=5002;
const int INF=1000000000;
struct Node{
int ed;
int dis;
};
vector<Node> adj[MAXV];
int d[MAXV];
bool vis[MAXV]={false};
int n,m;
int prim(){
fill(d,d+MAXV,INF);
d[0]=0;
int cnt=0;
for(int i=0;i<n;i++){
int u=-1,MIN=INF;
for(int j=0;j<n;j++){
if(d[j]<MIN&&vis[j]==false){
u=j;MIN=d[j];
}
}
if(u==-1) return -1;
vis[u]=true;
cnt+=d[u];
for(int j=0;j<adj[u].size();j++){
int v=adj[u][j].ed;
if(vis[v]==false&&d[v]>adj[u][j].dis){
d[v]=adj[u][j].dis;
}
}
}
return cnt;
}
int main()
{
freopen("in.txt","r",stdin);
cin>>n>>m;
for(int i=0;i<m;i++){
int s,e,t;cin>>s>>e>>t;
s=s-1;e=e-1;
Node t1,t2;
t1.dis=t;t1.ed=e;
t2.dis=t;t2.ed=s;
adj[s].push_back(t1);
adj[e].push_back(t2);
}
int ans=prim();
if(ans==-1) cout<<"orz";
else cout<<ans;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int MAXV=5002;
const int INF=1000000000;
int G[MAXV][MAXV];
int d[MAXV];
bool vis[MAXV];
int n,m;
int prim(){
fill(vis,vis+MAXV,false);
fill(d,d+MAXV,INF);
d[0]=0;
int cnt=0;
for(int i=0;i<n;i++){
int u=-1,MIN=INF;
for(int j=0;j<n;j++){
if(d[j]<MIN&&vis[j]==false){
u=j;MIN=d[j];
}
}
if(u==-1) return -1;
vis[u]=true;
cnt+=d[u];
for(int j=0;j<n;j++){
if(vis[j]==false&&G[u][j]!=INF){
if(d[j]>G[u][j])
d[j]=G[u][j];
}
}
}
return cnt;
}
int main()
{
freopen("in.txt","r",stdin);
cin>>n>>m;
fill(G[0],G[0]+MAXV*MAXV,INF);
for(int i=0;i<m;i++){
int s,e,t;cin>>s>>e>>t;
G[s-1][e-1]=G[e-1][s-1]=t;
}
int ans=prim();
if(ans==-1) cout<<"orz";
else cout<<ans;
return 0;
}