Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
題目鏈接:POJ-1287
題目描述:
您被分配設(shè)計(jì)廣泛區(qū)域中某些點(diǎn)之間的網(wǎng)絡(luò)連接。您將獲得該區(qū)域中的一組點(diǎn),以及可連接成對(duì)點(diǎn)的電纜的一組可能路線。對(duì)于兩點(diǎn)之間的每條可能路線,您將獲得連接該路線上的點(diǎn)所需的電纜長(zhǎng)度。請(qǐng)注意,在兩個(gè)給定點(diǎn)之間可能存在許多可能的路徑。假設(shè)給定的可能路線(直接或間接)連接該區(qū)域中的每?jī)蓚€(gè)點(diǎn)。
您的任務(wù)是為該區(qū)域設(shè)計(jì)網(wǎng)絡(luò),以便在每?jī)蓚€(gè)點(diǎn)之間存在連接(直接或間接)(即,所有點(diǎn)都是互連的,但不一定是通過(guò)直接電纜),并且總長(zhǎng)度為用過(guò)的電纜很少。
思路
Prim算法:
Prim算法就是定義mat用來(lái)存圖,dist數(shù)組用來(lái)存每個(gè)點(diǎn)到最小生成樹(shù)的最短距離,vis數(shù)組標(biāo)記此點(diǎn)是否已經(jīng)在最小生成樹(shù)中了(防止出現(xiàn)環(huán))。
實(shí)際操作就是先隨便把一個(gè)點(diǎn)加入到生成樹(shù)里(一般是第一個(gè)點(diǎn)),然后尋找與該點(diǎn)距離最短的點(diǎn)并加入,然后在尋找與1,2點(diǎn)相連最短的點(diǎn),并加入到生成樹(shù)中,就這樣不斷的加下去,直到加入的點(diǎn)數(shù)與原圖一致終止;
可以自己手動(dòng)模仿一下過(guò)程,其實(shí)還是好理解的!
##易錯(cuò)點(diǎn)
1.每次加入前確保加入的權(quán)值比之前加入的權(quán)值要小,否則不加入;
如 第一次 給出 1-2邊的權(quán)值為3, 然后某次加邊操作說(shuō) 1-2邊權(quán)值為10, 這時(shí)候我們保留第一次的權(quán)值(保留權(quán)值較小的那次)
2.題意說(shuō)是邊可能無(wú)限,那么大概不能用Kruskal算法來(lái)做;Prim算法用來(lái)存頂點(diǎn),而Kruskal算法用來(lái)存邊,當(dāng)邊很多或者不確定是,我們可能無(wú)法用Kruskal算法來(lái)做(當(dāng)然,現(xiàn)在2018年10月9日16:39:24可能還是不能做的,以后說(shuō)不定也可以做)
代碼:
Prim算法:
#include
#include
using namespace std;
#define MAX 5050
#define INF 0x3f3f3f3f
int mat[MAX][MAX], vis[MAX], dist[MAX];
void init(int n)
{
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=n; j++)
{
mat[i][j] = INF;
}
dist[i] = INF;
}
}
void Union(int x, int y, int val)
{
if(val < mat[x][y])
{
mat[x][y] = mat[y][x] = val;
}
}
int Prim(int n)
{
int sum = 0;
dist[1] = 0;
for(int i = 1; i<=n; i++)
{
int min_dist = INF, min_vertex;
for(int j = 1; j<=n; j++)
{
if(!vis[j] && dist[j] < min_dist)
{
min_dist = dist[j];
min_vertex = j;
}
}
vis[min_vertex] = 1;
sum += min_dist;
for(int j = 1; j<=n; j++)
{
if(!vis[j] && mat[min_vertex][j] < dist[j])
{
dist[j] = mat[min_vertex][j];
}
}
}
return sum;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
while(cin >> n, n != 0)
{
cin >> m;
init(n);
memset(vis, 0, sizeof(vis));
for(int i = 0; i<m; i++)
{
int x, y, val;
cin >> x >> y >> val;
Union(x, y, val);
}
cout << Prim(n) << endl;
}
return 0;
}
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。