description有
n n
個景點,
m' role="presentation" style="position: relative;">m
m條連通
n n
個景點的單向路,要求用一次或多次線路遊覽完所有景點,一條線路的定義是從乙個景點出發經過若干景點後回到起點,除起點景點經過兩次之外其餘景點只能經過一次,問遊覽完所有景點的最短路程,保證有解
input
第一行一整數
t' role="presentation" style="position: relative;">t
t表示用例組數,每組用例首先輸入兩個整數n,
m n,m
表示景點數和路數,之後
m m
行每行輸入三個整數u,
v,w' role="presentation" style="position: relative;">u,v
,wu,
v,w表示從
u u
景點到v' role="presentation" style="position: relative;">v
v景點有一條長度為
w w
的單向路(2
≤n≤200,m
≤30000,1
≤w≤10
4)' role="presentation" style="position: relative;">(2≤
n≤200,m≤
30000,1
≤w≤10
4)(2
≤n≤200,m
≤30000,1
≤w≤10
4)output
輸出遊覽完所有景點的最短路程
sample input1
6 9
1 2 5
2 3 5
3 1 10
3 4 12
4 1 8
4 6 11
5 4 7
5 6 9
6 5 4
sample output
solution
對於乙個路程a1
→a2→
...→
am→a
1 a1→
a2→.
..→a
m→a1
,將其看作
m m
條邊ai
→ai+
1,1≤
iam→a
1' role="presentation" style="position: relative;">ai→
ai+1
,1≤i
am→a
1ai→
ai+1
,1≤i
am→a
1,那麼問題變成,找
n n
條邊,要求每個點作為起點和頂點各出現一次,且這些邊的邊權和最小,也即二分圖最小匹配,邊權取負後求二分圖最大匹配再取負即為答案
code
#include
#include
#include
#include
using
namespace
std;
#define maxn 205
#define inf 0x3f3f3f3f
int nx,ny;
int linker[maxn],lx[maxn],ly[maxn],slack[maxn];
int visx[maxn],visy[maxn],w[maxn][maxn];
int dfs(int x)
}else
if(slack[y]>tmp)
slack[y]=tmp;
}return0;}
int km()
}int res=0;
for(i=1;i<=ny;i++)
if(linker[i]!=-1)
res+=w[linker[i]][i];
return res;
}int t,n,m;
int main()
nx=ny=n;
printf("%d\n",-km());
}return
0;}
KM求最優匹配 hdu 3488 Tour
km求最優匹配 hdu 3488 tour km求最優匹配 hdu 3488 tour 題意 給出兩個端點和這兩點間的距離,求出這些邊構成的所有環中 邊和最小是多少,每個點只能用一次,即每個點只能在乙個環中 思路 把每個點拆成兩個點,每條邊的出度點 起點 作為x部,入度點 終點 作為y部 然後進行最...
HDU 3488 Tour 再次感受到KM的強大
題意 這題自己yy了下,沒想到結論還是對的。題目告訴我們乙個有向圖,現在問將圖中的每乙個點都劃分到乙個環中的最少代價是多少?每條邊都有乙個代價。解法 由於要成環,那麼將這個圖進行拆點,就變成了單向的二分圖了,此時乙個完備匹配就是一種連線策略,只要保證沒有邊是和自己相連,就能夠滿足題目中要求的每個點至...
HDU 3488 Tour 再次感受到KM的強大
題意 這題自己yy了下,沒想到結論還是對的。題目告訴我們乙個有向圖,現在問將圖中的每乙個點都劃分到乙個環中的最少代價是多少?每條邊都有乙個代價。解法 由於要成環,那麼將這個圖進行拆點,就變成了單向的二分圖了,此時乙個完備匹配就是一種連線策略,只要保證沒有邊是和自己相連,就能夠滿足題目中要求的每個點至...