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; }