【题目来源】http://poj.org/problem?id=1251
【题目思路】最小生成树,用邻接矩阵和朴素的prim算法都过了,可见水之深切。
【题目感想】在读入时候为了提高速度用了std::ios::sync_with_stdio(false); 来取消cin和stdin的同步特性,这样cin和scanf速度几乎相同,但是就不能混用scanf和cin了。 介绍此点的文章详见https://www.byvoid.com/blog/fast-readfile/ 或 http://hi.baidu.com/christole/item/69db9b1d8f7672f387ad4eaf
【代码】
朴素prim
#include <cstdio>
#include <cstdlib>
#include <iostream>
#define MAXN 100
#define INF 99999999
using namespace std;
int g[MAXN][MAXN]={0};
int dist[MAXN]={0};
bool belong[MAXN]={0};
bool pre [MAXN]={0};
int n=0;
void init()
{
for(int i=2;i<=n;++i)
{
belong[i]=false;
dist[i]=g[1][i];
pre[i]=1;
}
dist[1]=0;//dist[1] no sense
belong[1]=true;
}
int main()
{
//freopen("in.txt","r",stdin);
std::ios::sync_with_stdio(false);
while (cin>>n,n!=0)
{
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
g[i][j]=INF;
char dest;int weight;
int num=0;
for (int i=1;i<=n-1;++i)
{
cin>>dest>>num;
for (int j=1;j<=num;++j)
{
cin>>dest>>weight;
int ndest=(int)dest-'A'+1;
g[i][ndest]=g[ndest][i]=weight;
}
}
init();
int min,k;
for (int i=1;i<=n-1;++i)
{
min=INF;
k=0;
for (int j=1;j<=n;++j)
{
if (!belong[j] && dist[j]<min)
{
min=dist[j];
k=j;
}
}
if (k==0) cerr<<"No nodes to be extend."<<endl;
belong[k]=true;
for (int j=1;j<=n;++j)
{
if (!belong[j] && g[k][j]!=INF && dist[j]>g[k][j])
{
dist[j]=g[k][j];
pre[j]=k;
}
}
}
int ret=0;
for (int i=2;i<=n;++i) ret+=dist[i];
cout<<ret<<endl;
}
//system("pause");
return 0;
}