標籤:失敗 ttl root while detail cst 細節 演算法 破壞
描述
一種文字持久的戰爭後,對武器的戰爭終於爆發了littleken之間和KnuthOcean的王國。突然和猛烈攻擊KnuthOcean的部隊已呈現littleken指揮網路徹底失敗。必須馬上建立臨機操作網路。littleken訂單史努比項目負責。
這種情況對每一個細節,史努比認為,當務之急是使littenken的命令到達每一個斷開的節點在破壞網路和決定計劃建立一個單向通訊網路。節點分布在一個平面上。如果littleken的命令可以直接傳送從一個節點到另一個節點B,
電線要沿直線段串連的兩個節點建立。因為這是在戰時,沒有之間的所有節點對CAN線建成。史努比想要計劃要求導線的最短的總長度,建設可以很快完成。
輸入
輸入包含多個測試案例。每個測試案例的第一行包含兩個整數n(n≤100),在摧毀網路節點數,和M(M≤104),數量的節點對之間的導線,可建。下一行n包含一對有序的XI和易,
給出節點的笛卡爾座標。
然後按照mlines每個都包含兩個整數i和j之間的1和n(含)意義的線可以結我與節點j為前者對後者的單向的命令傳遞之間建立。littleken總部都位於節點1。進程到檔案結束。
輸出
對於每個測試案例,輸出一行,其中包含最短的總長度到小數點後兩位元的總長度。
題解:
最小樹形圖模板題,直接跑朱劉演算法
朱劉演算法:http://blog.csdn.net/wsniyufang/article/details/6747392
這一題沒有什麼別的
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 struct Node 8 { 9 int u,v;10 double dis;11 }edge[20001];12 int n,m;13 double X[10001],Y[10001],ans,in[10001];14 int pre[10001],vis[10001],id[10001];15 void add(int u,int v,double d,int num)16 {17 edge[num].u=u;18 edge[num].v=v;19 edge[num].dis=d;20 }21 int main()22 {int i,j,u,v,root;23 //freopen("canal0.in","r",stdin);24 //freopen("canal.out","w",stdout);25 cin>>n>>m;26 for (i=1;i<=n;i++)27 {28 scanf("%lf%lf",&X[i],&Y[i]);29 }30 for (i=1;i<=m;i++)31 {32 scanf("%d%d",&u,&v);33 add(u,v,sqrt((X[u]-X[v])*(X[u]-X[v])+(Y[u]-Y[v])*(Y[u]-Y[v])),i);34 }35 ans=0;root=1;36 while (1)37 {//cout<<root<<endl;38 memset(in,127,sizeof(in));39 for (i=1;i<=m;i++)40 if (edge[i].u!=edge[i].v&&edge[i].dis<in[edge[i].v])41 {42 in[edge[i].v]=edge[i].dis;43 pre[edge[i].v]=edge[i].u;44 }45 in[root]=0;46 int cnt=0;47 memset(id,-1,sizeof(id));48 memset(vis,-1,sizeof(vis));49 for (i=1;i<=n;i++)50 {51 ans+=in[i];52 v=i;53 while (vis[v]!=i&&id[v]==-1&&v!=root)54 {55 vis[v]=i;56 v=pre[v];57 }58 if (id[v]==-1&&v!=root)59 {60 id[v]=++cnt;61 for (j=pre[v];j!=v;j=pre[j]) id[j]=cnt;62 }63 }64 if (cnt==0) break;65 for (i=1;i<=n;i++) 66 if (id[i]==-1) id[i]=++cnt;67 for (i=1;i<=m;i++)68 {69 int v=edge[i].v;70 edge[i].u=id[edge[i].u];71 edge[i].v=id[edge[i].v];72 if (edge[i].u!=edge[i].v) edge[i].dis=edge[i].dis-in[v];73 }74 n=cnt;75 root=id[root];76 }77 printf("%.2lf",ans);78 }
Poj 3164 Command Network