Prim:
一开始自己写了个函数找字母和数字对应关系WA,利用ASCII就对了。。。
仔细一看26个字母写错了。。。敲代码的时候就担心这个问题还检查过还是错了,引以为戒!
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <math.h>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
char ch[30]="0ABCDEFGHIGKLMNOPQRSTUVWXYZ";
int n;
int g[30][30];
int dis[30];
int mark[30];
int findch(char x){
for(int i=1;i<=26;i++)
if(ch[i]==x)return i;
return -1;
}
void Prim(){
memset(mark,0,sizeof(mark));
memset(dis,0x3f,sizeof(dis));
int ans=0;
dis[1]=0;
for(int i=0;i<n;i++){
int minn=INF,index;
for(int j=1;j<=n;j++){
if(!mark[j]&&dis[j]<minn){
minn=dis[j];
index=j;
}
}
if(minn==INF)break;
ans+=minn;
mark[index]=1;
for(int j=1;j<=n;j++){
if(!mark[j]){
dis[j]=min(g[index][j],dis[j]);
//有些点可能第一次找不是最短,但下一次是,但下一个点不能到达该点
}
}
}
printf("%d\n",ans);
}
int main(){
while(scanf("%d",&n),n){
memset(g,0x3f,sizeof(g));
char x,y;
int d,m;
for(int i=1;i<n;i++){
scanf(" %c %d",&x,&m);
int a=x-'A'+1;
while(m--){
scanf(" %c %d",&y,&d);
int b=y-'A'+1;
if(g[a][b]>d)
g[a][b]=g[b][a]=d;
}
}
Prim();
}
return 0;
}
Kruscal:
遍历全图找最短边会超时,因为这道题边数已知,可以把边从小到大排序然后从1号到末尾逐个尝试
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <math.h>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int n;
int g[30][30];
int tree[30];
struct node{
int s,e,w;
}edge[400];
int index;
int find(int x){
if(x==tree[x])return x;
else return tree[x]=find(tree[x]);
}
void Kruscal(){
for(int i=1;i<=n;i++)
tree[i]=i;
int cnt=n-1,ans=0,t=0;
while(cnt){
int a,b,c;
a=edge[t].s;
b=edge[t].e;
c=edge[t++].w;
int ra=find(a);
int rb=find(b);
if(ra!=rb){
tree[rb]=ra;
ans+=c;
cnt--;
}
}
printf("%d\n",ans);
}
bool _compare(node a,node b){
return a.w<b.w;
}
int main(){
while(scanf("%d",&n),n){
memset(g,0x3f,sizeof(g));
char x,y;
int d,m;
index=0;
for(int i=1;i<n;i++){
scanf(" %c %d",&x,&m);
int a=x-'A'+1;
while(m--){
scanf(" %c %d",&y,&d);
int b=y-'A'+1;
edge[index].e=a;
edge[index].s=b;
edge[index].w=d;
index++;
}
}
sort(edge,edge+index,_compare);
Kruscal();
}
return 0;
}
TLE
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <math.h>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
char ch[30]="0ABCDEFGHIGKLMNOPQRSTUVWXYZ";
int n;
int g[30][30];
int tree[30];
int findch(char x){
for(int i=1;i<=26;i++)
if(ch[i]==x)return i;
return -1;
}
int find(int x){
if(x==tree[x])return x;
else return tree[x]=find(tree[x]);
}
void Kruscal(){
for(int i=1;i<=n;i++)
tree[i]=i;
int ans=0,cnt=n-1;
while(cnt){
int a,b,minn=INF;
for(int i=1;i<n;i++){
for(int j=i;j<=n;j++){
if(minn>g[i][j]){
minn=g[i][j];
a=i,b=j;
}
}
}
int ra=find(a);
int rb=find(b);
if(ra!=rb){
tree[rb]=ra;
cnt--;
ans+=minn;
}
g[a][b]=INF;
}
printf("%d\n",ans);
}
int main(){
while(scanf("%d",&n),n){
memset(g,0x3f,sizeof(g));
char x,y;
int d,m;
for(int i=1;i<n;i++){
getchar();
scanf("%c %d",&x,&m);
int a=findch(x);
while(m--){
getchar();
scanf("%c %d",&y,&d);
int b=findch(y);
if(g[a][b]>d)
g[a][b]=d;
}
}
Kruscal();
}
}