POJ 1287 Networking

我的第一道最短路

Kruskal

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
inline int read(){
	int x=0,f=1,ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
struct stu{
	int x,y,w;
}a[2505];
inline bool cmp(stu a,stu b){
	return a.w<b.w;
}
int f[55];
inline int find(int x){
	return f[x]=(f[x]==x)?f[x]:find(f[x]);
}
inline bool same(int x,int y){
	return find(x)==find(y);
}
inline void add(int x,int y){
	f[find(x)]=find(y);
}
int main(){
	int n=read();
	while(n){
		int m=read();
		int ans=0;
		for(int i=1;i<=m;i++) a[i].x=read(),a[i].y=read(),a[i].w=read();
		sort(a+1,a+1+m,cmp);
		for(int i=1;i<=n;i++) f[i]=i;
		for(int i=1;i<=m;i++)
			if(!same(a[i].x,a[i].y))
				ans+=a[i].w,add(a[i].x,a[i].y);
		printf("%d\n",ans);
		n=read();
	}
	return 0;
}

Prim(要用G++交)

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN=55;
const int MAXM=2505;
const int inf=0x3f3f3f3f;
inline int read(){
	int x=0,f=1,ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int nxt[MAXM],to[MAXM],cost[MAXM],h[MAXN],cnt;
inline void add(int x,int y,int w){
	nxt[cnt]=h[x];to[cnt]=y;cost[cnt]=w;h[x]=cnt++;
	nxt[cnt]=h[y];to[cnt]=x;cost[cnt]=w;h[y]=cnt++;
}
struct stu{
	int dis,id;
	bool operator < (const stu b)const{
		return dis>b.dis;
	}
};
priority_queue<stu> q;
int dis[MAXN],vis[MAXN];
inline int prim(){
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	while(!q.empty()) q.pop();
	int res=0;
	dis[1]=0;
	q.push((stu){dis[1],1});
	while(!q.empty()){
		stu e=q.top();q.pop();
		while(!q.empty()&&vis[e.id]) e=q.top(),q.pop();
		if(q.empty()&&vis[e.id]) break;
		res+=dis[e.id];vis[e.id]=1;
		for(int i=h[e.id];i!=-1;i=nxt[i])
			if(!vis[to[i]]&&dis[to[i]]>cost[i])
				dis[to[i]]=cost[i],q.push((stu){dis[to[i]],to[i]});
	}
	return res;
}
int n,m;
int main(){
	n=read();
	while(n!=0){
		memset(h,-1,sizeof(h));cnt=0;
		m=read();
		for(int i=1;i<=m;i++){
			int x=read(),y=read(),w=read();
			add(x,y,w);
		}
		printf("%d\n",prim());
		n=read();
	}
	return 0;
}

  

posted @ 2018-09-28 21:03  古城独钓  阅读(102)  评论(0编辑  收藏  举报