【问题描述】
【解决思路】
这道题的答案多种多样,不妨选择最简单的情况:
假使从1到n的最短路径等于最小生成树的长度,皆为不小于n–1(n-1条变)的最小素数prime,这时最短路径(最小生成树)即为一条链。
再假使这条链路的前n-2段的长度皆为1,最后1段的长度即为prime-(n-2)。
至于其余的边则可以赋予一个较大值(确保不影响最小生成树)。
【代码实现】
#include <iostream>
#include <cmath>
#define MAX_LEN 1000000
using namespace std;
int minPrimeAbove(int num)
{
if(num == 1)
return 2;
bool isPrime = true;
while(num < MAX_LEN)
{
for(int i = 2; i <= sqrt(num); i++)
{
if(num % i == 0 && num / i != 1)
{
isPrime = false;
break;
}
}
if(isPrime)
return num;
isPrime = true;
num++;
}
}
int main()
{
int n, m; //n vertices, m edges
cin >> n >> m;
int prime = minPrimeAbove(n - 1);
cout << prime << " " << prime << endl;
int i; // the index of vertex
for(i = 1; i < n - 1; i++)
cout << i << " " << i + 1 << " 1" << endl;
cout << i << " " << i + 1 << " " << prime - n + 2 << endl;
i++;
int j = i - 2;
int k = m - n + 1; // the numbers of unweighed edges
for(; k > 0; k--)
{
if(j == 0)
{
i--;
j = i - 2;
}
cout << j << " " << i << " " << MAX_LEN <<endl;
j--;
}
return 0;
}