题意:
LRJ要读N本书(N <= 100),如果有两本内容相似,读了某一本,另一本只需要花一半的时间就能读完,给N本书的时间,和M对内容相似的书,求LRJ读完N本书的最少时间。
思路:
DFS求联通块,找出联通块里面的最小时间。
LRJ。。。
代码:
#include <cstdio>
#include <vector>
using namespace std;
#define N 105
#define MAX 100000
vector <int> adj[N];
bool vis[N];
int n, m, a, b, t[N], ans;
int mint;
void dfs(int x)
{
if (mint > t[x]) mint = t[x];
vis[x] = true;
ans += t[x] / 2;
for (int i = 0; i < adj[x].size(); ++ i)
if (!vis[adj[x][i]]) dfs(adj[x][i]);
}
int main()
{
while (scanf("%d %d", &n, &m))
{
if (n == 0 && m == 0) break;
for (int i = 0; i < N; ++ i)
{
vis[i] = false;
adj[i].clear();
}
ans = 0;
for (int i = 0 ; i < n; ++ i)
scanf("%d", &t[i]);
while (m --)
{
scanf("%d %d", &a, &b);
adj[a].push_back(b);
adj[b].push_back(a);
}
for (int i = 0; i < n; ++ i)
{
if (!vis[i])
{
mint = MAX;
dfs(i);
ans += (mint+1) / 2;
}
}
printf("%d\n", ans);
}
}