一.原题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=586
二.题目大意:说了那么多,就是给一个邻接矩阵,让你求最短路,注意要边的权要先加上2个点的适配器价格之和。
三.代码:
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <queue> using namespace std; const int MAX_SIZE = 1002, INF = 0x3f3f3f3f, MOD = 1000000007; int nodeNum, nodeCost[MAX_SIZE], graph[MAX_SIZE][MAX_SIZE], lowCost[MAX_SIZE]; int Prim(int start) { int i, j, minEdge, res, v; for(i = 0; i < nodeNum; i++) lowCost[i] = graph[start][i]; lowCost[start] = -1; res = 0; for(i = 1; i < nodeNum; i++){ minEdge = INF; for(j = 0; j < nodeNum; j++) if(lowCost[j] != -1 && lowCost[j] < minEdge){ minEdge = lowCost[j]; v = j; } lowCost[v] = -1; res += minEdge; for(j = 0; j < nodeNum; j++) if(lowCost[j] > graph[v][j]) lowCost[j] = graph[v][j]; } return res; } int main() { //freopen("in.txt", "r", stdin); int i, j, test; cin>>test; while(test--){ cin>>nodeNum; for(i = 0; i < nodeNum; i++) cin>>nodeCost[i]; for(i = 0; i < nodeNum; i++) for(j = 0; j < nodeNum; j++){ cin>>graph[i][j]; graph[i][j] += nodeCost[i] + nodeCost[j]; } cout<<Prim(0)<<endl; } }