HDU1879 继续畅通工程
2015-08-13 08:02
239 查看
把状态为1的权重都改为0,之后prim()就可以了。
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
const int maxn = 105;
const int INF = 1<<8;
struct Node{
int vex, weight, state;
Node(int _vex = 0, int _weight = 0, int _state = 0):vex(_vex),weight(_weight),state(_state){}
};
vector<Node> G[maxn];
int n;
bool intree[maxn];
int mindist[maxn];
void Init(){
for(int i = 0; i < maxn; i++){
G[i].clear() ;
intree[i] = false;
mindist[i] = INF;
}
}
int prim(int s){
int ans = 0;
int addNode, tempMin, ves;
intree[s] = true;
for(unsigned int i = 0; i < G[s].size(); i++){
ves = G[s][i].vex;
mindist[ves] = G[s][i].weight;
}
for(int nodeNum = 1; nodeNum <= n-1; nodeNum++){
tempMin = INF;
for(int i = 1; i <= n; i++){
if(intree[i] == false && mindist[i] < tempMin){
tempMin = mindist[i];
addNode = i;
}
}
intree[addNode] = true;
ans += tempMin;
for(int i = 0; i < G[addNode].size() ; i++ ){
ves = G[addNode][i].vex;
if(intree[ves] == false && G[addNode][i].weight < mindist[ves]){
mindist[ves] = G[addNode][i].weight;
}
}
}
return ans;
}
int main(){
int v1, v2, weight, state;
while(scanf("%d",&n) != EOF && n){
Init();
for(int i = 0; i < n*(n-1)/2; i ++){
scanf("%d%d%d%d",&v1, &v2, &weight, &state);
G[v1].push_back(Node(v2, weight, state));
G[v2].push_back(Node(v1, weight, state));
}
for(int i = 1; i <= n; i++){
for(int j = 0; j < G[i].size(); j++){
if(G[i][j].state == 1){
G[i][j].weight = 0;
}
}
}
int ans = prim(1);
printf("%d\n",ans);
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
const int maxn = 105;
const int INF = 1<<8;
struct Node{
int vex, weight, state;
Node(int _vex = 0, int _weight = 0, int _state = 0):vex(_vex),weight(_weight),state(_state){}
};
vector<Node> G[maxn];
int n;
bool intree[maxn];
int mindist[maxn];
void Init(){
for(int i = 0; i < maxn; i++){
G[i].clear() ;
intree[i] = false;
mindist[i] = INF;
}
}
int prim(int s){
int ans = 0;
int addNode, tempMin, ves;
intree[s] = true;
for(unsigned int i = 0; i < G[s].size(); i++){
ves = G[s][i].vex;
mindist[ves] = G[s][i].weight;
}
for(int nodeNum = 1; nodeNum <= n-1; nodeNum++){
tempMin = INF;
for(int i = 1; i <= n; i++){
if(intree[i] == false && mindist[i] < tempMin){
tempMin = mindist[i];
addNode = i;
}
}
intree[addNode] = true;
ans += tempMin;
for(int i = 0; i < G[addNode].size() ; i++ ){
ves = G[addNode][i].vex;
if(intree[ves] == false && G[addNode][i].weight < mindist[ves]){
mindist[ves] = G[addNode][i].weight;
}
}
}
return ans;
}
int main(){
int v1, v2, weight, state;
while(scanf("%d",&n) != EOF && n){
Init();
for(int i = 0; i < n*(n-1)/2; i ++){
scanf("%d%d%d%d",&v1, &v2, &weight, &state);
G[v1].push_back(Node(v2, weight, state));
G[v2].push_back(Node(v1, weight, state));
}
for(int i = 1; i <= n; i++){
for(int j = 0; j < G[i].size(); j++){
if(G[i][j].state == 1){
G[i][j].weight = 0;
}
}
}
int ans = prim(1);
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- 函数调用
- 字符串哈希函数
- app详细介绍界面-01
- 单表60亿记录等大数据场景的MySQL优化和运维之道
- 单表60亿记录等大数据场景的MySQL优化和运维之道
- 单表60亿记录等大数据场景的MySQL优化和运维之道
- [GDOI模拟2015.08.08]排列
- 在浏览器敲入一个网址
- 浅谈密码存储安全
- 询问区间第k大(小)——主席树
- VC++ 关于 ON_UPDATE_COMMAND_UI 相关的作用.
- spark加载hadoop本地库的时候出现不能加载的情况要怎么解决呢?
- POJ 3784 二叉堆
- 设置密码输入框光标未选中为提示文字,输入密码不可见的实现
- ios关于frame等知识点的总结一
- [Leetcode 2, Medium] Add Two Numbers
- mysql高可用架构之mysql-mmm配置详解
- js设置输入框失去光标与光标选中时样式
- 进程与线程、应用程序域关系
- WebView的高级用法