POJ–1639[Picnic Planning] K限度最小產生樹

來源:互聯網
上載者:User

演算法流程:
1.將該點(以下用v0表示)刪除,將得到m個連通分量。

2.對每個連通分量求最小產生樹,假設m個。

3.從每個連通分量中找與v0關聯的權值最小的邊,與v0相串連,這樣將得到v0的最小m度產生樹

4.如果 k  < m 那麼這種樹是不存在的。

5.如果 k >=m ,那麼考慮構建 m+1度 最小產生樹 ,將與v0關聯的且不在當前的樹中的邊

6.如果將其加入樹中 ,必然會存在一個環,那麼刪掉該環中與v0不關聯的權值最大邊,將得到加入該邊後的最小產生樹,且是m+1的。

7.枚舉上述6的邊找樹權值最小,那麼即是m+1度限制的最小產生樹。

8.重複5.6.7,直到k 度最小產生樹出現。

 

CODE:

/*K限度最小產生樹*//*(1):求某一點限度<=K的最小產生樹*//*AC代碼:0ms*/#include <iostream>#include <cstdio>#include <memory.h>#include <algorithm>#include <map>#include <string>#include <queue>#define MAXN 100#define INF 1e8#define min(a,b) (a<b?a:b)#define max(a,b) (a>b?a:b)using namespace std;struct edge{int u,v,w,next; bool flag;}E[200000],E1[20000],E2[20000];//E[]:存整體的K限度產生樹//E1[]:存原始的輸入邊//E2[]:存與vo相關聯的邊int head[MAXN],ecnt,vcnt;;int N,K,cnt,vo,now;map<string,int>hash;int p[MAXN];int pre[MAXN];bool vis[MAXN];bool ok;void Insert(int u,int v,int w){E[ecnt].u=u;E[ecnt].v=v;E[ecnt].w=w;E[ecnt].flag=true;E[ecnt].next=head[u];head[u]=ecnt++;}int cmp(const void *p1,const void *p2){return ((struct edge *)p1)->w-((struct edge *)p2)->w;}int find_set(int x){if(x!=p[x])p[x]=find_set(p[x]);return p[x];}void Init(){int i,u,v,w;string a,b;hash.clear();cnt=0;for(i=1;i<=N;i++){cin>>a>>b>>w;if(!hash[a]) hash[a]=++cnt;if(!hash[b]) hash[b]=++cnt;u=hash[a];v=hash[b];E1[i].u=u;E1[i].v=v;E1[i].w=w;}scanf("%d",&K);string c="Park";vo=hash[c];qsort(E1+1,N,sizeof(E1[1]),cmp); /*printf("&&&%d\n",vo);for(i=1;i<=N;i++)printf("%d %d %d\n",E1[i].u,E1[i].v,E1[i].w);printf("\n");*/}void swap(int &a,int &b){int t;if(b==vo){t=a;a=b;b=t;}}void Run(){int i,u,v,w;now=0;for(i=0;i<vcnt;i++){u=E2[i].u;v=E2[i].v;w=E2[i].w;int du=find_set(u);int dv=find_set(v);if(du!=dv){E2[i].flag=true;now++;p[du]=dv;Insert(u,v,w);Insert(v,u,w); }}}queue<int>Q;int bfs(int s,int e,int ith,bool ok){int i,u,v,w;while(!Q.empty()) Q.pop();memset(vis,false,sizeof(vis));memset(pre,-1,sizeof(pre));Q.push(s);vis[s]=true;while(!Q.empty()){//printf("&\n");u=Q.front();Q.pop();for(i=head[u];i!=-1;i=E[i].next){if(!E[i].flag) continue;//已經被標記掉的v=E[i].v;if(!vis[v]){pre[v]=i;if(v==e) break;vis[v]=true;Q.push(v);}}}int id,Index,res=0;u=e;while(true){//printf("##\n");id=pre[u];//刪掉環中與vo不關聯的權值最大的邊if((E[id].u!=vo&&E[id].v!=vo)&&E[id].w>res){res=E[id].w;Index=id;}u=E[id].u;if(u==s) break;}if(ok){E[Index].flag=E[Index^1].flag=false;Insert(s,e,E2[ith].w);Insert(e,s,E2[ith].w);E2[ith].flag=true;//標記為樹邊}return E2[ith].w-res;}void ff(){int i,u,v,w,temp;int id=-1,res=INF;//枚舉那些與vo關聯但不在當前產生樹內的邊for(i=0;i<vcnt;i++){//printf("**\n");if(!E2[i].flag){temp=bfs(vo,E2[i].v,i,false);if(temp<res){id=i;res=temp;}}}if(res>=0) {ok=false;return;}bfs(vo,E2[id].v,id,true); }int get_ans(){int res=0,i;for(i=0;i<ecnt;i+=2){if(E[i].flag)res+=E[i].w; }return res;}void Solve(){int i,u,v,w;memset(head,-1,sizeof(head));ecnt=0;for(i=1;i<=cnt;i++)p[i]=i;vcnt=0;for(i=1;i<=N;i++){u=E1[i].u;v=E1[i].v;swap(u,v);w=E1[i].w;if(u==vo||v==vo){E2[vcnt].u=u;E2[vcnt].v=v;E2[vcnt].flag=false;E2[vcnt].w=w;vcnt++;continue;}int du=find_set(u);int dv=find_set(v);if(du!=dv){p[du]=dv;Insert(u,v,w);Insert(v,u,w);}}Run();/*printf("*\n");for(i=0;i<vcnt;i++)printf("%d %d %d\n",E2[i].u,E2[i].v,E2[i].w);printf("\n");printf("^%d\n",now);*///擴充ok=true;for(i=now;i<K&&ok;i++)ff();int ans=get_ans();printf("Total miles driven: %d\n",ans);}int main(){//freopen("A.21.dat","r",stdin);//freopen("1639.txt","w",stdout);while(scanf("%d",&N)!=EOF){Init();Solve();}return 0;}/*7Jonesy Park 3J Jonesy 1Jonesy James 1Jonesy Jimmy 1J Park 10Park James 10Jimmy Park 104Total miles driven: 6*/

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.