Agri Net POJ1258 && Constructing Roads POJ2421
来源:互联网 发布:d star算法 c 编辑:程序博客网 时间:2024/06/05 01:20
题意,在给出的图中,使用最小花费的边,使这个图仍然连通。
#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int maxn=10005;int head[maxn];int n,len=0,counter;long long ans;struct node{ int v,cost,u;//操作符的重写默认是小于等于 bool operator < (const node& tmp) const{return cost< tmp.cost;}}gra[maxn];struct BingCha{//并查集 int father[105]; void initial(){//初始化不要忘记 for(int i=1;i<=n;i++){ father[i]=i; } } int getfather(int v){ if(father[v]==v)return v; return father[v]=getfather(father[v]);//状态压缩 } bool findtwo(int a,int b){//看是否是同根的 return getfather(a)==getfather(b); } void unioned(int a,int b){ int fa=father[a],fb=father[b]; father[fa]=fb; }}jihe;void addedge(int u,int v,int cost){ gra[len].u=u; gra[len].v=v; gra[len].cost=cost; len++;}void init(){ len=0; counter=1;ans=0; int x; memset(head,-1,sizeof(head));//memset gra? for(int i=1;i<=n;i++){//add the edges for(int j=1;j<=n;j++){ scanf("%d",&x); if(i<j){ addedge(i,j,x); } } } }int main(){ while(scanf("%d",&n)!=EOF){ init(); sort(gra,gra+len);//已经有序,那么从小值开始选边添加即可,也保证了最优结果 int idx=0; jihe.initial(); while(counter<n || idx<len){ if(!jihe.findtwo(gra[idx].u,gra[idx].v)){//如果不同根,就选择这条边,执行更新操作 ans+=gra[idx].cost; counter++; jihe.unioned(gra[idx].u,gra[idx].v); } idx++; } printf("%d\n",ans); }}
2421 也是裸的mst:只要把已经建了的作为输入先处理一下就好了。
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 const int maxn=10010; 6 7 int n,len,counter; 8 long long ans; 9 struct node{10 int v,cost,u;11 bool operator < (const node& tmp) const{12 return cost< tmp.cost;13 14 }15 }gra[maxn*(maxn-1)>>1];16 struct BingCha{17 int father[110];18 void initial(){19 for(int i=0;i<=n;i++){20 father[i]=i;21 }22 }23 int getfather(int v){24 if(father[v]==v)return v;25 return father[v]=getfather(father[v]);26 }27 bool findtwo(int a,int b){28 return getfather(a)==getfather(b);29 }30 void unioned(int a,int b){31 int fa=getfather(a),fb=getfather(b);32 father[fa]=fb;33 }34 }jihe;35 void addedge(int u,int v,int cost){36 gra[len].u=u;37 gra[len].v=v;38 gra[len].cost=cost;39 len++;40 }41 int findxy(int x,int y){42 43 if(x>y){int z=y;y=x;x=z;}44 int j=n-1,id=0;45 for(int i=1;i<x;i++){46 id+=j--;47 }48 y-=x;// here!!!49 id+=y;50 return id;51 }52 void init(){53 len=0;54 counter=1;ans=0;55 jihe.initial();56 int x,q,y;57 //memset gra?58 for(int i=1;i<=n;i++){//add the edges59 for(int j=1;j<=n;j++){60 scanf("%d",&x);61 if(i<j){62 addedge(i,j,x);63 }64 }65 }66 scanf("%d",&q);67 for(int i=1;i<=q;i++){68 scanf("%d%d",&x,&y);69 int idx=findxy(x,y)-1;70 if(!jihe.findtwo(gra[idx].u,gra[idx].v)){71 counter++;72 jihe.unioned(gra[idx].u,gra[idx].v);73 }74 }75 }76 77 78 int main(){79 while(scanf("%d",&n)!=EOF){80 init();81 sort(gra,gra+len);82 int idx=0;83 while(counter<n){//|| idx<=len84 if(!jihe.findtwo(gra[idx].u,gra[idx].v)){85 ans+=gra[idx].cost;86 counter++;87 jihe.unioned(gra[idx].u,gra[idx].v);88 }89 idx++;90 }91 printf("%d\n",ans);92 93 }94 }
0 0
- Agri Net POJ1258 && Constructing Roads POJ2421
- POJ2421 Constructing Roads
- poj2421 Constructing Roads
- POJ2421 Constructing Roads
- poj2421 Constructing Roads
- POJ2421 Constructing Roads
- HDU1102&&POJ2421 Constructing Roads
- poj2421 [java]Constructing Roads
- POJ2421 Constructing Roads
- poj2421 Constructing Roads
- poj2421——Constructing Roads
- poj2421 Constructing Roads (prime)
- POJ1258 Agri-Net
- POJ1258 Agri-Net
- POJ1258 Agri-Net
- POJ1258 Agri-Net
- Agri-Net(POJ1258)
- poj1258 - Agri-Net
- Bridging signals ZOJ 3627 POJ1631 HDU1950
- AC题目简解-dp
- 项目开发Linux入门
- Power Station POJ 4045
- 炮兵阵地 POJ 1185
- Agri Net POJ1258 && Constructing Roads POJ2421
- POJ 1036 Rails 模拟堆栈
- POJ 2184 Cow Exhibition 01背包的变形
- POJ 1879 Tempus et mobilius Time and motion 队列和栈
- editplus的配置文件来支持sql语法高亮【转】
- KMP算法详解
- POJ 2255 Tree Recovery 二叉树的遍历
- 数据结构实验:算数表达式
- LCA Tarjan离线算法