从零单排17

来源:互联网 发布:游戏王卡片淘宝 编辑:程序博客网 时间:2024/04/29 18:14

呵呵呵呵

prim和dijsktra太像了。。。

然后终于会写kruskal了。。。

今天收获好多感觉。。。

状态特别好。。。


hdu 1879:http://acm.hdu.edu.cn/showproblem.php?pid=1879

/*手打最小生成树。。prim和dijsktra太像了。。*/#include<iostream>#include<algorithm>#define INF 0x3f3f3f3fusing namespace std;int map[105][105];int dis[105];int visit[105];int n,N;void getmap(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){map[i][j]=map[j][i]=i==j?0:INF;}}while(N--){int s,e,l,flag;cin>>s>>e>>l>>flag;if(flag){map[s][e]=map[e][s]=0;}else{map[s][e]=map[e][s]=l;}}}void prim(){int k=1;int ans=0;memset(visit,0,sizeof(visit));memset(dis,INF,sizeof(dis));for(int i=1;i<=n;i++){dis[i]=map[1][i];}visit[1]=1;for(int i=1;i<n;i++){int MIN=INF;for(int j=1;j<=n;j++){if(!visit[j]&&dis[j]<MIN){MIN=dis[j];k=j;}}if(MIN==INF)break;visit[k]=1;ans+=MIN;for(int j=1;j<=n;j++){if(!visit[j]){dis[j]=min(dis[j],map[k][j]);}}}cout<<ans<<endl;}int main(){while(cin>>n&&n!=0){N=n*(n-1)/2;getmap();prim();}system("pause");return 0;}

hdu 1233:http://acm.hdu.edu.cn/showproblem.php?pid=1233

/*真的是灰常轻松的模版题*/#include<iostream>#include<algorithm>#define INF 0x3f3f3f3fusing namespace std;int map[105][105];int visit[105];int dis[105];int n,N;void getmap(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){map[i][j]=map[j][i]=i==j?0:INF;}}while(N--){int s,e,l;scanf("%d%d%d",&s,&e,&l);map[s][e]=map[e][s]=min(map[s][e],l);}}void prim(){int k=1;int ans=0;memset(visit,0,sizeof(visit));memset(dis,INF,sizeof(dis));for(int i=1;i<=n;i++){dis[i]=map[1][i];}visit[1]=1;for(int i=1;i<n;i++){int MIN=INF;for(int j=1;j<=n;j++){if(!visit[j]&&dis[j]<MIN){MIN=dis[j];k=j;}}if(MIN==INF)break;visit[k]=1;ans+=MIN;for(int j=1;j<=n;j++){if(!visit[j]){dis[j]=min(dis[j],map[k][j]);}}}cout<<ans<<endl;}int main(){while(scanf("%d",&n)!=EOF&&n!=0){N=n*(n-1)/2;getmap();prim();}system("pause");return 0;}

hdu 1875:http://acm.hdu.edu.cn/showproblem.php?pid=1875

/*处理一下输入就好,将不符合位于10-1000区间的点视为不连通就好*/#include<iostream>#include<algorithm>#include<cmath>#define INF 0x3f3f3f3fusing namespace std;double map[105][105];double dis[105];int visit[105];int n;struct point{double x;double y;}a[105];double dist(int i,int j){return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));}void getmap(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){map[i][j]=i==j?0:INF;}}for(int i=1;i<=n;i++){cin>>a[i].x>>a[i].y;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){double len=dist(i,j);if(len>=10&&len<=1000){map[i][j]=map[j][i]=len*100;}}}}void prim(){int k;double ans=0;memset(visit,0,sizeof(visit));memset(dis,INF,sizeof(dis));for(int i=1;i<=n;i++){dis[i]=map[1][i];}visit[1]=1;int i;for(i=1;i<n;i++){double MIN=INF;for(int j=1;j<=n;j++){if(!visit[j]&&dis[j]<MIN){MIN=dis[j];k=j;}}if(MIN==INF)break;visit[k]=1;ans+=MIN;for(int j=1;j<=n;j++){if(!visit[j]){dis[j]=min(dis[j],map[k][j]);}}}if(i!=n){cout<<"oh!"<<endl;}else{printf("%.1lf\n",ans);}}int main(){int T;cin>>T;while(T--){cin>>n;getmap();prim();}system("pause");return 0;}

hdu 1232:http://acm.hdu.edu.cn/showproblem.php?pid=1232 额。。并查集乱入

/*并查集裸题~1A*/#include<iostream>using namespace std;int father[1005];int n;void init(){for(int i=1;i<=n;i++){father[i]=i;}}int find(int x){if(x==father[x]){return x;}else{return find(father[x]);}}void Union(int x,int y){x=find(x);y=find(y);if(x!=y){father[x]=y;}}int main(){while(scanf("%d",&n)!=EOF&&n!=0){int m;scanf("%d",&m);init();while(m--){int x,y;scanf("%d%d",&x,&y);Union(x,y);}int ans=1;for(int i=1;i<=n;i++){if(father[i]==i){ans++;}}printf("%d\n",ans-2);}system("pause");return 0;}

hdu 1233:http://acm.hdu.edu.cn/showproblem.php?pid=1233  kruskal算法哈哈

/*终于会写kruskal了哈哈*/#include<iostream>#include<algorithm>#define INF 0x3f3f3f3fusing namespace std;int father[5000];struct road{int x;int y;int len;}r[5000];bool cmp(const road &a,const road &b){return a.len<b.len;}int find(int x){if(x==father[x]){return x;}else{return find(father[x]);}}int ans;int n;int N;void Union(road temp){int x=find(temp.x);int y=find(temp.y);if(x!=y){ans+=temp.len;father[x]=y;}}void getmap(){for(int i=1;i<=N;i++){scanf("%d%d%d",&r[i].x,&r[i].y,&r[i].len);}}void kruskal(){for(int i=1;i<=N;i++){father[i]=i;}sort(r+1,r+N+1,cmp);for(int i=1;i<=N;i++){Union(r[i]);}printf("%d\n",ans);}int main(){while(scanf("%d",&n)!=EOF&&n!=0){N=n*(n-1)/2;getmap();ans=0;kruskal();}system("pause");return 0;}


感觉纠结好久的东西突然一下子解决了~~~

今晚搞搞别的东西吧~

写的有点累了~~

加油~

原创粉丝点击