首页 > 代码库 > POJ 3228 最小生成树的应用
POJ 3228 最小生成树的应用
要使得路径上边的最大值最小,实际上就是沿着最小生成树走,就满足条件。故先求出最小生成树,然后保存,在dfs一遍搜索路径。
VIEW CODE
//#pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #include<math.h> #include<queue> #include<stack> #include<string> #include<cstring> #include<iostream> #include<map> #include<vector> #include<algorithm> #include<stdlib.h> #include<set> #define eps 1e-8 #define SS(n) scanf("%d",&n) #include<map> #define mmax 10010 #define debug #define inf 0x3fffffff using namespace std; int n,m; int store[210]; int val[210]; struct node { int st,en,val; }E[30000]; bool cmp(node x,node y) { return x.val<y.val; } int fa[210]; int find(int x) { if(x==fa[x]) return fa[x]; return fa[x]=find(fa[x]); } bool check() { for(int i=1;i<=n;i++) { if(i==find(i)&&store[i]<val[i]) return 0; } return 1; } int solve() { for(int i=0;i<=n;i++) fa[i]=i; if(check()) return 0; for(int i=0;i<m;i++) { int x=find(E[i].st); int y=find(E[i].en); if(x!=y) { fa[y]=x; store[x]+=store[y]; val[x]+=val[y]; } if(check()) return E[i].val; } return -1; } int main() { while(cin>>n) { if(n==0) break; for(int i=1;i<=n;i++) scanf("%d",&val[i]); for(int i=1;i<=n;i++) scanf("%d",&store[i]); cin>>m; for(int i=0;i<m;i++) scanf("%d %d %d",&E[i].st,&E[i].en,&E[i].val); sort(E,E+m,cmp); int ans=solve(); if(ans==-1) puts("No Solution"); else printf("%d\n",ans); } }
POJ 3228 最小生成树的应用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。