poj1639頂點度限制生成樹

2022-05-12 12:58:08 字數 3025 閱讀 4366

題目:

對根的度數有限制的最小生成樹;

先忽略根,跑最小生成樹,得到幾個連通塊,再一一與根連上;

然後在限制內用根連出去的邊來使生成樹更小,這需要列舉邊以及用dp維護樹上邊的dfs序之前最大的乙個;

此題用鄰接矩陣比較方便。

改了一晚上,終於發現是混淆了n和cnt,cnt才是點數。

鄰接表失敗版:

#include#include

#include

#include

#include

using

namespace

std;

int n,m,head[25],ct=1,cnt,ed,fa[25

],cost,reg;

char s1[15],s2[15

];map

mp;struct

n}edge[

50],e[25

];struct

nndp[

25];

bool use[50],use2[50],lk[25],vis[25

];bool cmp(n x,n y)

int find(int

x)void

kruskal()

}}void dfs(int

x)

else

dfs(u);

}}void add(int x,int y,int

z)int

main()

if(mp[s2]==1

)

//edge[++ct]=(mp[s2],head[mp[s1]],x);head[mp[s1]]=ct;

//edge[++ct]=(mp[s1],head[mp[s2]],x);head[mp[s2]]=ct;

add(mp[s2],mp[s1],x);

add(mp[s1],mp[s2],x);

}//for(int i=2;i<=ct;i++)

//printf("w=%d to=%d\n",edge[i].w,edge[i].to);

scanf("

%d",&m);

kruskal();

sort(e+1,e+ed+1

,cmp);

for(int i=1;i<=ed;i++)

}vis[

1]=1

;

for(int i=1;i<=ed;i++)

//for(int i=1;i<=n;i++)

//printf("i=%d v=%d bh=%d\n",i,dp[i].v,dp[i].bh);

//for(int i=1;i<=n;i++)

//printf("dp[%d]=%d\n",i,dp[i].v);

while(reg

}//printf("mx=%d d=%d k=%d\n",mx,d,k);

if(mx<=0)break

; cost-=mx;

use[dp[d].bh]=0

; use2[k]=1

; reg++;

dp[d].v=-1

; memset(vis,

0,sizeof

vis);

vis[d]=1

; dfs(d);

}printf(

"total miles driven: %d\n

",cost);

return0;

}

失敗版**如下:

#include#include

#include

#include

#include

#include

using

namespace

std;

int n,m,ct,cnt,fa[250],cost,reg,key[250],mne[250],inf=0x3f3f3f3f

;string

s1,s2;

mapmp;

struct

nedge[

50000

];struct

nndp[

50000

];bool

in[250][250

];int sid[250][250

];bool cmp(n x,n y)

int find(int

x)void

kruskal()

}}void dfs(int x,int

f) }

dfs(u,x);

}}int

main()

scanf("%d

",&m);

kruskal();

//for(int i=1;i<=cnt;i++)

//for(int j=1;j<=cnt;j++)

//if(in[i][j])printf("in[%d][%d]=%d\n",i,j,in[i][j]);

//cout

mne);

for(int i=2;i<=cnt;i++)

}for(int i=1;i<=cnt;i++)//

for(int j=reg+1;j<=m;j++)

dfs(

1,-1

);

int mn=inf;

intd;

for(int i=2;i<=cnt;i++)

}if(mn>=0)break

; cost+=mn;

in[dp[d].u][dp[d].v]=in[dp[d].v][dp[d].u]=0

;

in[1][d]=in[d][1]=1

; }

printf(

"total miles driven: %d\n

",cost);

return0;

}

2 2頂點宣告

2.2 頂點宣告 該小節對頂點宣告的描述絕大多數都取自翁雲兵的 著色器和效果 該文對頂點宣告的描述是我所見到最詳盡最透徹的,這裡向作者表示敬意 到現在為止,我們已經使用自由頂點格式 flexible vertex format fvf 來描述頂點結構中的各分量。但是,在可程式設計管線中,我們的頂點資...

POJ 1639 k度限制生成樹

題意就是求最小生成樹 但是有乙個頂點的度必須不大於k 具體的方法網上都有,但是 寫起來之複雜難以令人想象,我由於 能力還太弱,導致只能看著別人的 重寫一遍,優化了一些部分。1.求出除去k度點的最小生成森林,設森林數為m 2.將這m棵樹與k度點用每棵樹中與k度點距離最短的點相連,生成乙個m度最小生成樹...

Unity Shader (四)頂點程式示例

1 在頂點函式中實現凸起效果 2 漸變及溜光效果 3 頂點扭曲效果 旋轉矩陣去影響頂點 優化繞y軸旋轉的矩陣,除去0與其他項相乘的項 float x cos angle v.vertex.x sin angle v.vertex.z float z sin angle v.vertex.x cos ...