我正在尝试制作一个程序,其中用户输入n点坐标,0< n< = 100.据说,必须用墨水连接点,例如从墨点A到点X,同时跟随墨水线并尽量少用墨水。
我想过使用Prim算法或类似的东西来获取MST,但为此我需要一个图表。在我看过的所有网页中,他们并没有真正解释这一点,他们总是已经有了边缘的图形。
我需要帮助专门用一堆(x,y)坐标在C ++中创建一个图形,比如用户输入:
请注意我刚开始使用C ++并且我不能使用任何奇怪的库,因为这将是一个像CodeForces的页面,你只能使用本机库。
(对于那些也在这里并且在这里寻求帮助的人,这个输入的正确输出将是12)
答案 0 :(得分:0)
假设完整图表可能最合适,如“Beta”所示。
以下代码可能会在数组点中的点列表中创建每对两个点之间的边,并返回创建的边数。 执行此代码后,您可以应用Prim算法来查找MST。
// Definition of Structure "node" and an array to store inputs
typedef struct node {
int x; // x-cordinate of dot
int y; // y-cordinate of dot
} dots[100];
// Definition of Structure "edge"
typedef struct edge {
int t1; // index of dot in dots[] for an end.
int t2; // index of dot in dots[] for another end.
float weight; // weight (geometric distance between two ends)
} lines[];
// Function to create edges of complete graph from an array of nodes.
// Argument: number of nodes stored in the array dots.
// ReturnValue: number of edges created.
// Assumption: the array lines is large enough to store all edges of complete graph
int createCompleteGraph(int numberOfNodes){
int i,j,k,x-diff,y-diff;
k=0; // k is index of array lines
for (i=0; i<numberOfNodes-1; i++) {// index of a node at one end
for (j=i+1; j<numberOfNodes; j++) {// index of a node at another end
lines[k].t1 = i;
lines[k].t2 = j;
x-diff = dots[i].x - dots[j].x;
y-diff = dots[i].y - dots[j].y;
lines[k].weight = sqrt(x-diff * x-diff + y-diff * y-diff) // calculate geometric distance
k++;
}
}
return k;
}