hdu 1863 畅通工程

来源:互联网 发布:软件license @port lic 编辑:程序博客网 时间:2024/06/02 07:27

最小生成树的裸题,愣是用2种姿势ac了一篇,好好复习了一下2种算法

#include<iostream>#include<vector>#define maxn 105using namespace std;int n,m;const int inf=1<<31-1;vector<int>mapp[maxn];int vaule[maxn][maxn];int visit[maxn];int prim()//prim算法 {int re=0,k=0;int d[maxn];fill(d,d+m+1,inf);fill(visit,visit+1+m,0);d[1]=0;while(1){int v=-1;for(int i=1;i<=m;i++){if(!visit[i]&&(v==-1||d[i]<d[v])) v=i;}if(v==-1||d[v]==inf) return -1;re+=d[v];k++;if(k==m) return re;visit[v]=1;for(int i=0;i<mapp[v].size();i++){int x=mapp[v][i];if(!visit[x]&&vaule[v][x]<d[x]) d[x]=vaule[v][x];}}}int main(){while(cin>>n>>m&&n){for(int i=1;i<=m;i++) mapp[i].clear();for(int i=0;i<n;i++){int x,y,z;cin>>x>>y>>z;if(x!=y){mapp[x].push_back(y);mapp[y].push_back(x);vaule[x][y]=z;vaule[y][x]=z;}}int re=prim();if(re==-1) cout<<"?"<<endl;else cout<<re<<endl;}return 0;} 

第二种算法

#include<iostream>#include<algorithm>#include<cstring>#define maxn 2000using namespace std;int n,m;int f[maxn];struct stu{int a,b,l; };bool cmp(stu x,stu y){return x.l<y.l;}stu mapp[maxn];int dfs(int x){if(f[x]!=x) f[x]=dfs(f[x]);return f[x];}int kruskal(){int re=0;//结果; int k=1;sort(mapp,mapp+n,cmp);for(int i=1;i<=m;i++) f[i]=i;for(int i=0;i<n;i++){int x=mapp[i].a,y=mapp[i].b; if(dfs(x)!=dfs(y)){k++;f[dfs(x)]=dfs(y);re+=mapp[i].l;}if(k==m) return re;}return -1;}int main(){cin.sync_with_stdio(false);while(cin>>n>>m&&n){for(int i=0;i<n;i++) cin>>mapp[i].a>>mapp[i].b>>mapp[i].l;int re=kruskal();if(re==-1) cout<<"?"<<endl;else cout<<re<<endl;}return 0;}



0 0