Prime+heap+邻接矩阵
Source Code
Problem: 1251 | User: imutzcy | |
Memory: 740K | Time: 0MS | |
Language: G++ | Result: Accepted |
- Source Code
# include<cstdio> # include<cstring> # include<queue> # include<climits> # include<iostream> using namespace std; # define N 30 # define INF INT_MAX struct node { int u,dis; node(){} node(int uu,int dd):u(uu),dis(dd){} bool operator < (const node &a) const { return dis>a.dis; } }; int n,m,map[N][N],d[N],see[N]; priority_queue<node> q; int prime(int s) { int v,u,res=0; while(!q.empty()) q.pop(); memset(see,0,sizeof(see)); d[s]=0; q.push(node(s,0)); while(!q.empty()) { node now=q.top(); q.pop(); u=now.u; if(!see[u]) { see[u]=1; res+=now.dis; for(v=1;v<=n;v++) if(!see[v]&&map[u][v]<d[v]) { d[v]=map[u][v]; q.push(node(v,map[u][v])); } } } return res; } /*void init() { int i,j; for(i=1;i<=n;i++) { d[i]=INF; for(j=1;j<=n;j++) map[i][j]=INF; } } */ void init() { char from,to; int num,i,j,len,a,b; for(i=1;i<=n;i++) { d[i]=INF; for(j=1;j<=n;j++) map[i][j]=INF; } getchar(); for(i=1; i<n; i++) { cin>>from>>num; a = from - 'A' + 1; while( num-- ) { cin>>to>>len; b = to -'A' + 1; map[a][b] = map[b][a] = len; } getchar(); } } int main() { while(cin>>n,n) { init(); printf("%d\n",prime(1));//根节点从1开始 } return 0; }
POJ 对这题格式有问题。。。坑了我7次的RE。。。。ZOJ 用scanf无压力,擦。
Prime+heap+邻接表
Source Code
Problem: 1251 | User: imutzcy | |
Memory: 740K | Time: 0MS | |
Language: G++ | Result: Accepted |
- Source Code
# include<cstdio> # include<cstring> # include<queue> # include<vector> # include<climits> # include<iostream> using namespace std; const int maxn=30; const int maxm=1000; const int inf=INT_MAX; typedef pair<int,int> node; struct edge { int u,v,w,next; }e[maxm]; struct cmp { bool operator()(const node &a,const node &b)const { return a.second>b.second; } }; int n; int num,head[maxn]; int dis[maxn],vis[maxn]; priority_queue<node,vector<node>,cmp> q; inline void add(int u,int v,int w) { e[num].u=u; e[num].v=v; e[num].w=w; e[num].next=head[u]; head[u]=num++; } void addedge(int u,int v,int w) { add(u,v,w); add(v,u,w); } int prime(int s) { int i,u,v,mincost=0; dis[s]=0; q.push(make_pair(s,0)); while(!q.empty()) { node a=q.top(); q.pop(); u=a.first; if(vis[u]) continue; vis[u]=1; mincost+=a.second; for(i=head[u];i!=-1;i=e[i].next) { v=e[i].v; if(!vis[v]&&e[i].w<dis[v]) { dis[v]=e[i].w; q.push(make_pair(v,e[i].w)); } } } return mincost; } void init(int n) { num=0; memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); for(int i=0;i<=n;i++) { dis[i]=inf; vis[i]=0; } } void input() { init(n); char from,to; int Num,i,j,len,a,b; getchar(); for(i=1; i<n; i++) { cin>>from>>Num; a = from - 'A' + 1; while( Num-- ) { cin>>to>>len; b = to -'A' + 1; addedge(a,b,len); } getchar(); } } int main() { while(cin>>n,n) { input(); printf("%d\n",prime(1)); } return 0; }