题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1709
题意描述:在现有的边的基础上,增删路径,使得最后的路径数最少而且整张图连通,增加或删除都会有代价,要算出最小代价和对原图的修改情况;
思路大致是用并查集,先把现有的可连接集合全部找出来,删掉无用的边,然后用各自集合中找一个点连接就可以了;
比较坑的一点是,整数很大,用int过不了,最好换成longlong;
直接上AC代码:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <map>
using namespace std;
const int MAX_VALUE = 99999999;
enum State{HASONE,NONE,NEWONE,DELETE,USED};
vector<int>parent;
int getParent(int num){
if (num == parent[num])return num;
return parent[num] = getParent(parent[num]);
}
bool link(int x, int y){
int a = getParent(x);
int b = getParent(y);
if (a != b){
parent[a] = b;
return true;
}
return false;
}
void func(){
vector<vector<State> >matrix;
int m_Size, a, d;
cin >> m_Size;
cin >> d >> a;
vector<State>vLine(m_Size, NONE);
matrix.resize(m_Size, vLine);
for (int i = 0; i < m_Size; i++){
parent.push_back(i);
for (int j = 0; j < m_Size; j++){
char tmpi;
cin >> tmpi;
if (tmpi=='1'){
matrix[i][j] = HASONE;
}
else matrix[i][j] = NONE;
}
}
long long cancelCount = 0;
long long linkCount = 0;
long long useCount = 0;
for (size_t i = 0; i < m_Size; i++)
{
for (size_t j = 0; j < m_Size; j++){
if (matrix[i][j] == HASONE){
linkCount++;
if (link(i, j)){
useCount++;
matrix[i][j] = matrix[j][i] = USED;
}
else{
matrix[i][j] = DELETE;
matrix[j][i] = DELETE;
}
}
}
}
cancelCount = linkCount - useCount;
vector<int>sites;
for (int i = 0; i < m_Size; i++){
if (getParent(i) == i)sites.push_back(i);
}
int src = sites[0];
for (size_t i = 1; i < sites.size(); i++)
{
matrix[src][sites[i]] = NEWONE;
matrix[sites[i]][src] = NEWONE;
}
long long newCount = sites.size() - 1;
long long ans = cancelCount * d + newCount*a;
cout << ans << endl;
for (int i = 0; i < m_Size; i++)
{
for (int j = 0; j < m_Size;j++)
switch (matrix[i][j]){
case DELETE:cout << 'd'; break;
case NEWONE:cout << 'a'; break;
default:cout << 0; break;
}
cout << endl;
}
}
int main(){
freopen("out.txt", "w", stdout);
freopen("in.txt", "r", stdin);
func();
}