POJ 1789248512583026
生活随笔
收集整理的這篇文章主要介紹了
POJ 1789248512583026
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這個真的太水了——MST專輯。
如果不會MST的兩種算法的同學(xué)可以出門右轉(zhuǎn)了。
大致講一下,第一題我是用Prim+堆優(yōu)化的(畢竟點(diǎn)比較多),后面三題用的是Kruskal(習(xí)慣打,而且并查集常數(shù)實(shí)在小)
前三題是裸題,最后一題要BFS預(yù)處理圖上兩點(diǎn)間的最短距離再跑Kruskal,稍微麻煩了點(diǎn)
按順序貼自己看吧(第四題數(shù)據(jù)有坑,數(shù)組要開大)
1789CODE
#include<cstdio> #include<string> #include<queue> #include<iostream> #include<cstring> using namespace std; const int N=2005; struct data {int x,num;bool operator <(const data s) const{return s.x<x;} }; struct edge {int to,next,v; }e[N*N]; priority_queue <data> tree; int head[N],dis[N],n,i,j,k,ans; string s[N]; bool vis[N]; inline int calc(int x,int y) {int res=0;for (int i=0;i<s[x].size();++i)if (s[x][i]!=s[y][i]) res++;return res; } inline void add(int x,int y,int z) {e[++k].to=y; e[k].v=z; e[k].next=head[x]; head[x]=k; } int main() { for (;;){memset(e,-1,sizeof(e));memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis));memset(dis,63,sizeof(dis));cin>>n; k=ans=0;if (!n) break;for (i=1;i<=n;++i)cin>>s[i];for (i=1;i<n;++i)for (j=i+1;j<=n;++j){int res=calc(i,j);add(i,j,res); add(j,i,res);}dis[1]=0; data p;p.x=0; p.num=1; tree.push(p);while (!tree.empty()){int now=tree.top().num;tree.pop();if (vis[now]) continue;vis[now]=1; ans+=dis[now];for (i=head[now];i!=-1;i=e[i].next)if (e[i].v<dis[e[i].to]){dis[e[i].to]=e[i].v;data p;p.x=dis[e[i].to]; p.num=e[i].to; tree.push(p);}}printf("The highest possible quality is 1/%d.\n",ans);}return 0; }?
2485CODE
#include<cstdio> #include<algorithm> using namespace std; const int N=505; struct data {int x,y,s; }a[N*N]; int t,n,i,j,k,x,father[N],ans; inline void read(int &x) {x=0; char ch=getchar();while (ch<'0'||ch>'9') ch=getchar();while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); } inline void write(int x) {if (x/10) write(x/10);putchar(x%10+'0'); } inline int comp(data a,data b) {return a.s<b.s; } inline int getfather(int k) {return father[k]==k?k:father[k]=getfather(father[k]); } int main() {read(t);while (t--){read(n);ans=k=0;for (i=1;i<=n;++i)for (j=1;j<=n;++j){read(x);if (i==j) continue;a[++k].x=i; a[k].y=j; a[k].s=x;}sort(a+1,a+k+1,comp);for (i=1;i<=n;++i)father[i]=i;for (i=1;i<=k;++i){int fx=getfather(a[i].x),fy=getfather(a[i].y);if (fx!=fy){ans=a[i].s;father[fx]=fy;}}write(ans); putchar('\n');}return 0; }
1258CODE
#include<cstdio> #include<algorithm> using namespace std; const int N=505; struct data {int x,y,s; }a[N*N]; int n,i,j,k,x,father[N],ans; inline void read(int &x) {x=0; char ch=getchar();while (ch<'0'||ch>'9') ch=getchar();while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); } inline void write(int x) {if (x/10) write(x/10);putchar(x%10+'0'); } inline int comp(data a,data b) {return a.s<b.s; } inline int getfather(int k) {return father[k]==k?k:father[k]=getfather(father[k]); } int main() {while (scanf("%d",&n)!=EOF){ans=k=0;for (i=1;i<=n;++i)for (j=1;j<=n;++j){read(x);if (i==j) continue;a[++k].x=i; a[k].y=j; a[k].s=x;}sort(a+1,a+k+1,comp);for (i=1;i<=n;++i)father[i]=i;for (i=1;i<=k;++i){int fx=getfather(a[i].x),fy=getfather(a[i].y);if (fx!=fy){ans+=a[i].s;father[fx]=fy;}}write(ans); putchar('\n');}return 0; }?
3026CODE
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=155,fx[4]={1,0,-1,0},fy[4]={0,1,0,-1}; struct data {int x,y,s; }e[N*N]; int i,j,n,m,t,k,q[N*N*10][2],step[N][N],father[N*N],ans; bool vis[N][N]; char a[N][N]; inline void BFS(int x,int y) {int head=0,tail=1;memset(vis,0,sizeof(vis));q[1][0]=x; q[1][1]=y; vis[x][y]=1; step[x][y]=0;while (head<tail){int xx=q[++head][0],yy=q[head][1];if (a[xx][yy]=='S'||a[xx][yy]=='A') e[++k].x=(x-1)*m+y,e[k].y=(xx-1)*m+yy,e[k].s=step[xx][yy];for (int i=0;i<4;++i){int xxx=xx+fx[i],yyy=yy+fy[i];if (!vis[xxx][yyy]&&a[xxx][yyy]!='#'&&xxx>0&&yyy>0&&xxx<=n&&yyy<=m) {vis[xxx][yyy]=1; step[xxx][yyy]=step[xx][yy]+1;q[++tail][0]=xxx; q[tail][1]=yyy;}}} } inline int comp(data a,data b) {return a.s<b.s; } inline int getfather(int k) {return father[k]==k?k:father[k]=getfather(father[k]); } int main() {scanf("%d\n",&t);while (t--){scanf("%d%d\n",&m,&n);for (k=0,ans=0,i=1;i<=n*m;++i)father[i]=i;for (i=1;i<=n;++i){for (j=1;j<=m;++j)a[i][j]=getchar();getchar();}for (i=1;i<=n;++i)for (j=1;j<=m;++j)if (a[i][j]=='S'||a[i][j]=='A') BFS(i,j);sort(e+1,e+k+1,comp);for (i=1;i<=k;++i){int fax=getfather(e[i].x),fay=getfather(e[i].y);if (fax!=fay){ans+=e[i].s;father[fax]=fay;}}printf("%d\n",ans);} }?
轉(zhuǎn)載于:https://www.cnblogs.com/cjjsb/p/8479413.html
總結(jié)
以上是生活随笔為你收集整理的POJ 1789248512583026的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 关闭与重启
- 下一篇: mybatis动态调用表名和字段名