锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鎻愪緵浜嗙偣錛堣繖閲屾槸junction錛夊拰鐐逛箣闂寸殑璺濈錛堟垨浠d環錛夛紱
瑕佹眰浠ユ渶鐭殑璺濈錛堟垨鏈灝忎唬浠鳳級閬嶅巻鎵鏈夌殑鐐癸紝鍚屾椂姣忎釜鐐瑰彲浠ュ嬈¤闂紱
鍒濈湅涔嬩笅錛岀粰浜虹殑鎰熻鏄浘璁虹浉鍏崇殑闂錛屾瘮濡傛梾琛岃呴棶棰樸佹鎷夌幆娓鎬箣綾匯?/p>
鍦ㄦ濊冭繖涓棶棰樼殑鏃跺欙紝蹇界劧闂磋仈鎯沖埌浜嗗浘璁轟腑鐨勬渶灝忕敓鎴愭爲錛岃櫧鐒跺茍涓嶆槸鐪熸瑕佸幓寰楀嚭鏈灝忕敓鎴愭爲錛?/p>
浣嗘槸鎸夌収鏈灝忕敓鎴愭爲鎵鎻愪緵鐨勬濊礬--榪欑偣寰堥噸瑕?-閭e氨鏄浘鍜屾爲涔嬮棿鏈夌潃鐩稿綋瀵嗗垏鐨勫叧緋伙細鍗充嬌鏈灝忕敓
鎴愭爲騫朵笉鑳界洿鎺ヨВ鍐寵繖涓棶棰橈紝浣嗘槸瀹冧滑涔嬮棿瀛樺湪鐨勮繖灞傚叧緋葷殑紜彁渚涗簡瑙e喅闂鐨勪竴涓湁鐩婄殑灝濊瘯鏂?/p>
鍚戯紱
浜庢槸錛屾濊冭繘浜嗕竴姝ワ紝闂浠?#8220;鍥?#8221;綆鍖栨垚浜?#8220;鏍?#8221;--濡備綍鎶婂綋鍓嶈繖涓棶棰橀噰鐢ㄦ爲鐨勭粨鏋勫拰鏂規硶琛ㄨ揪鍑?/p>
鏉ワ細鏍戠殑鏍硅妭鐐癸紝寰堣嚜鐒跺湴鎯沖埌浜嗙敱闂涓梾琛岀殑璧峰鑺傜偣鏉ヨ〃杈撅紱鐒跺悗錛岄殢鐫鑺傜偣鐨勪笉鏂姞鍏ワ紝鏍戝氨
鑷劧鍦扮敓鎴愶紝姝ゅ鐨勫叧閿湪浜庡浣曠敓鎴愶紝鎴栬呰鑺傜偣鍔犲叆鐨勮鍒欙紝浠ュ強姣忎釜鑺傜偣涓轟簡閫傚簲榪欎釜瑙勫垯錛屾墍
蹇呴』鎸佹湁鐨勭浉鍏沖睘鎬т俊鎭細鏈鐩存帴鐨勶紝鐖跺瓙鑺傜偣涔嬮棿鐨勫叧緋婚渶瑕佺淮鎶わ紝浠庣埗鑺傜偣鍒板瓙鑺傜偣鐨勮窛紱伙紙鎴栦唬
浠鳳級蹇呴』瑕佷繚鐣欙紝鍏舵錛岃冭檻鍒板鏋滄瘡涓妭鐐歸兘緇存姢鐩稿叧鐨勮窛紱伙紙浠d環錛変俊鎭紝閭d箞浠庡綋鍓嶈妭鐐瑰埌鏍硅妭
鐐圭殑浠d環涔熷氨鍙互鐢辨閫掓帹寰楀嚭錛岃繘涓姝ワ紝鎴戜滑鎵瑕佹眰鍑虹殑鏈鐭礬寰勶紙鎴栨渶灝忎唬浠鳳級涓嶅氨鍙互浠庝笂榪拌繖
浜涜妭鐐逛腑緇存姢鐨勮窛紱諱俊鎭腑寰楀嚭鍚楋紵榪欐槸闈炲父鍏抽敭鐨勪竴姝ワ紝瀹冩妸褰撳墠鎴戜滑鏋勫緩鐨勬暟鎹粨鏋勫拰闂鐨勮姹?/p>
涔嬮棿寤虹珛璧蜂簡鐩稿綋鐩存帴鐨勮仈緋匯傝繖璇存槑鎴戜滑鐩墠鎬濊冪殑鏂瑰悜鏄湁浠峰肩殑鑰屼笖鏋佹湁鍙兘欏虹潃榪欎釜鏂瑰悜鍓嶈
錛屽彲浠ュ緱鍑虹浉褰撲笉閿欑殑緇撴灉銆?/p>
鏄劇劧錛屾棦鐒惰姹傛渶鐭礬寰勶紙鏈灝忎唬浠鳳級錛岄偅涔堟垜浠洰鍓嶆瀯寤哄嚭鐨勮繖棰桱unction鏍戯紙鍥犱負鍏朵笂鐨勮妭鐐瑰湪棰?/p>
涓殑鐗╃悊鍚箟鏄唬琛↗unction錛岄偅榪欓噷鎴戜滑灝卞涓旂О鍏朵負Junction Tree錛夛紝鏍戜笂鐨勬瘡涓妭鐐逛篃搴斿綋淇濈暀
鍦ㄥ叾涔嬩笅鐨勫瓙鏍戠殑鏈鐭礬寰勶紙鏈灝忎唬浠鳳級錛岃繖灝辯浉褰撲簬鎶婃瘡涓妭鐐歸兘浣滀負鏍硅妭鐐癸紝鐒跺悗姹傚嚭鍚勬潯瀛愯礬寰?/p>
鐨勪唬浠鳳紝騫舵瘮杈冨緱鍑烘渶鐭礬寰勶紙鏈灝忎唬浠鳳級錛屼互鍙婂湪榪欐潯鏈鐭礬寰勪笂鐨勭洿鎺ュ瓙鑺傜偣錛?/p>
姣忓姞鍏ヤ竴涓瓙鑺傜偣錛屽氨瑕佸涓婅堪宸叉瀯寤哄嚭鐨勮繖浜涙暟鎹粨鏋勪腑鐨勪俊鎭繘琛岀淮鎶わ紝浠ヨ皟鏁存瘡涓妭鐐瑰綋鍓嶇殑鏈
鐭礬寰勪唬浠峰拰鐩稿簲榪欐潯璺緞涓婄殑鐩存帴瀛愯妭鐐癸紱褰撴墍鏈夊師“鍥?#8221;涓殑“杈?#8221;淇℃伅錛屼篃灝辨槸
(fromJunction,toJuction,ductLength)鎵浠h〃鐨勶紙璧峰鐐癸紝緇堟鐐癸紝闀垮害浠d環錛夛紝閮芥寜鐓т笂榪版柟妗堝姞鍏?/p>
Juction Tree涔嬪悗錛屾垜浠彲浠ョ煡閬撲粠鏈鍒濈殑璧峰鑺傜偣錛堜篃灝辨槸Junction Tree鐨勬牴鑺傜偣錛夊埌鏈緇堣妭鐐圭殑錛?/p>
Junction Tree涓婄殑鏌愭潯璺緞涓婄殑鍙跺瓙鑺傜偣錛夌殑鏈鐭紙鏈灝忎唬浠鳳級璺緞浜嗐?/p>
瀵逛簬Juction Tree榪欎釜ADT鎶借薄鏁版嵁緇撴瀯鐨勫叿浣撳疄鐜幫紝鑰冭檻鍒頒紭鍏堥槦鍒椾腑浜屽弶鍫嗙殑緇忓吀瀹炵幇寰寰浣跨敤鏁扮粍
錛屽悓鏃朵篃涓轟簡絎﹀悎TC SRM涓璐殑綆鎹鋒槑蹇殑紼嬪簭璁捐椋庢牸錛屾垜浠繖閲屽悓鏃朵嬌鐢ㄥ嚑涓暟緇勬潵緇存姢鍓嶈堪鏋勫緩
鍑虹殑鏁版嵁緇撴瀯銆?/p>
//////////////////////////////////////////////////////////////////////////////////////////
#include<cstdlib>
#include<vector>
#include<set>
using namespace std;
const int NIL = -1;
const int MAX = 50;
int Cost[MAX];
int ParentNode[MAX];
int MaxSubNode[MAX];
int MaxSubCost[MAX];
class PowerOutage
{
public:
int estimateTimeOut(vector<int> fromJunction, vector<int> toJunction, vector<int>
ductLength)
{
if (!CheckParameter(fromJunction, toJunction, ductLength)) return NIL;
Ini();
int count = fromJunction.size();
for (int i = 0; i < count; i++)
{
AddNode(fromJunction[i], toJunction[i], ductLength[i]);
}
return CalculateMinCost(fromJunction, toJunction, ductLength);
}
private:
void Ini()
{
memset(Cost, NIL, sizeof(int) * MAX);
memset(ParentNode, NIL, sizeof(int) * MAX);
memset(MaxSubNode, NIL, sizeof(int) * MAX);
memset(MaxSubCost, 0, sizeof(int) * MAX);
}
bool CheckParameter(const vector<int>& fromJunction, const vector<int>& toJunction,
const vector<int>& ductLength)
{
if (fromJunction.size() != toJunction.size() || toJunction.size() !=
ductLength.size())
return false;
return true;
}
void AddNode(int parent, int child, int cost)
{
if (parent < 0 || child < 0 || cost < 0) return;
Cost[child] = cost;
ParentNode[child] = parent;
int curParent = parent, curChild = child;
bool adjustParentCost = true;
while (adjustParentCost && curParent != NIL)
{
int candidateParentMaxSubCost = Cost[curChild] + MaxSubCost
[curChild];
if (MaxSubCost[curParent] < candidateParentMaxSubCost)
{
MaxSubCost[curParent] = candidateParentMaxSubCost;
MaxSubNode[curParent] = curChild;
curChild = curParent;
curParent = ParentNode[curParent];
}
else
{
adjustParentCost = false;
}
}
}
int CalculateMinCost(const vector<int>& fromJunction, const vector<int>&
toJunction, const vector<int>& ductLength)
{
int len = fromJunction.size();
int minCost = 0;
set<int> minCostPath;
minCostPath.insert(0);
int curNode = MaxSubNode[0];
while(curNode != NIL)
{
printf("%d;",curNode); // print the min cost path
minCostPath.insert(curNode);
curNode = MaxSubNode[curNode];
}
for (int i = 0; i < len; i++)
{
if (minCostPath.find(toJunction[i]) == minCostPath.end())
minCost += 2 * ductLength[i];
else
minCost += ductLength[i];
}
return minCost;
}
};