头一回用头文件queue,感觉还算方便。第一次提交的时候懒得用邻接表,用的邻接矩阵,它硬是没让我过…… 【sweet butter】 /* ID: wangqia6 TASK: butter LANG: C++ */ #include <fstream> #include <cstring> #include <queue> using namespace std; const long INF = 0x01010101; const long NMAX = 810; ifstream fin ("butter.in"); ofstream fout ("butter.out"); long g[NMAX][NMAX],dist[NMAX],counter[NMAX],sum[NMAX],edge[NMAX][NMAX], m,n,r,a,b,t,i,j,ans = INF,tmp; bool vis[NMAX]; queue<long> que; void spfa(long s) { long u,v,k; memset(vis,0,sizeof(vis)); memset(dist,0x01,sizeof(dist)); dist[s] = 0; vis[s] = true; que.push(s); while (! que.empty()) { u = que.front(); que.pop(); vis[u] = false; for (k = 1; k <= sum[u]; k++) { v = edge[u][k]; if (dist[u] + g[u][v] < dist[v]) { dist[v] = dist[u] + g[u][v]; if (! vis[v]) { vis[v] = true; que.push(v); } } } } return; } int main() { memset(counter,0,sizeof(counter)); fin >> m >> n >> r; for (i = 1; i <= m; i++) { fin >> t; counter[t]++; } memset(g,0x01,sizeof(g)); for (i = 1; i <= r; i++) { fin >> a >> b >> t; if (g[a][b] > t) { g[a][b] = t; g[b][a] = t; } } memset(sum,0,sizeof(sum)); for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) if (g[i][j] < INF) { sum[i]++; edge[i][sum[i]] = j; } for (i = 1; i <= n; i++) { spfa(i); tmp = 0; for (j = 1; j <= n; j++) { tmp += dist[j] * counter[j]; if (tmp > ans) break; } if (tmp < ans) ans = tmp; } fout << ans << endl; fin.close(); fout.close(); return 0; }