hnu 12947 Absurdistan Roads

2024-06-15 19:48
文章标签 hnu roads 12947 absurdistan

本文主要是介绍hnu 12947 Absurdistan Roads,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

hnu 12947  网址  http://acm.hnu.cn/online/?action=problem&type=show&id=12947

给出n    和 n*n的矩阵  a(i,j)表示i 到j 的距离   然后求n条边 是的这个最短路成立

用求最小生成树的方法求出n-1条边 这n-1条边肯定是有用的  主要是如何求出第n条边

用floyd求出任意两点之间的最短距离 

然后找出不满足最短距离的边  把它输出  如果都满足那就随便输出啦

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>#define eps 1e-8
#define op operator
#define MOD  10009
#define MAXN  100100
#define INF 0x3f3f3f3f  
#define FOR(i,a,b)  for(int i=a;i<=b;i++)
#define FOV(i,a,b)  for(int i=a;i>=b;i--)
#define REP(i,a,b)  for(int i=a;i<b;i++)
#define REV(i,a,b)  for(int i=a-1;i>=b;i--)
#define MEM(a,x)    memset(a,x,sizeof a)
#define ll __int64using namespace std;
int n,cnt;struct edge
{int u,v;int len;bool operator <(const edge p)const{return len<p.len;}
};
edge e[4000005];
int mp[2005][2005];int parent[2010];void init()
{MEM(mp,INF);for(int i=0;i<n;i++)parent[i]=-1;
}int Find(int x)
{int s;for(s=x;parent[s]>=0;s=parent[s]);while(s!=x){int tmp=parent[x];parent[x]=s;x=tmp;}return s;
}void Union(int R1,int R2)
{int r1=Find(R1),r2=Find(R2);int tmp=parent[r1]+parent[r2];if(parent[r1]>parent[r2]){parent[r1]=r2;parent[r2]=tmp;}else{parent[r2]=r1;parent[r1]=tmp;}
}void Kruskal()
{int x,y;init();/* if(n==2){printf("%d %d %d\n",e[0].u+1,e[0].v+1,e[0].len);printf("%d %d %d\n",e[0].u+1,e[0].v+1,e[0].len);return;}*/int num=0;for(int i=0;i<cnt;i++){x=e[i].u; y=e[i].v;if(Find(x)!=Find(y)){num++;printf("%d %d %d\n",e[i].u+1,e[i].v+1,e[i].len);mp[e[i].u][e[i].v]=mp[e[i].v][e[i].u]=e[i].len;Union(x,y);}if(num>=(n-1))  break;}
//        printf("%d %d %d\n",e[0].u+1,e[0].v+1,e[0].len);
}void floyd()
{for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++){if(mp[i][k]==INF)  break;mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);}
}int main()
{
//freopen("ceshi.txt","r",stdin);int cs=0;while(scanf("%d",&n)!=EOF){cnt=0;for(int i=0;i<n;i++){for(int j=0;j<n;j++){int x;scanf("%d",&x);if(i>j){e[cnt].u=i; e[cnt].v=j;e[cnt].len=x;cnt++;}}}sort(e,e+cnt);if(cs>0)puts("");cs++;Kruskal();floyd();int k;for(k=0;k<cnt;k++){if(mp[e[k].u][e[k].v]!=e[k].len){printf("%d %d %d\n",e[k].u+1,e[k].v+1,e[k].len);break;}}if(k==cnt){printf("%d %d %d\n",e[0].u+1,e[0].v+1,e[0].len);}}return 0;
}


这篇关于hnu 12947 Absurdistan Roads的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064411

相关文章

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

HNU-2023电路与电子学-实验1

写在前面: 这是电路与电子学课程的第一次实验,按照指导书的需求在Multisim软件搭建一个电路传感器模型,难度较小,细心完成就没有问题。 小tips:22级实验是采用上传到测试平台来进行功能检测,如果不通过则会打回修改后再重新提交,(我们那时候的评测系统特别特别慢,一次只能测一个同学,剩下同学就排队等着,久的时候甚至超过10个小时),这里列举一个常见的错误:热噪声有+号这端需要连接有源滤波器

随机算法 - HNU 13348 Finding Lines

Finding Lines Problem's Link:  http://acm.hnu.cn/online/?action=problem&type=show&id=13348&courseid=0   Mean:  给你平面上1e5个点,让你判断是否可以找到一条直线,使得p%的点都在这条直线上。 analyse: 经典的随机算法题。 每次随机出两个点,

HNU OS实验九

本内容针对湖南大学特色os实验前言 — os2024 lab 文档

hdu 1301 Jungle Roads (基础最小生成树)

题目:         链接:点击打开链接 题意:         对n个村庄之间的路进行修理, 然后是n-1行,每行的第一组数据时一个大写字母VIL和一个数K,Vil表示从这个村庄出发,K表示刚才的那个字母代表的村庄和其他村庄的路的数目,接下来在同一行是K组数据,每组是一个大写字母和一个数,大写字母表示和第一个村庄连接的村庄,数表示维修他们之间的路所需的费用。现在为了使维修费油最低,只需所

NYOJ 434 POJ 1251 Jungle Roads(最小生成树)

链接:click here 题意: 题目大意在相通n个岛屿的所有桥都坏了,要重修,重修每一个桥所用的时间不同,求重修使每个岛屿都间接或直接与其他岛屿相同时所用的的最短时间(只有修完一个桥后才可修下一个桥)。简言之就是求最小生成树。 对于数据,数据输入的第一行n代表岛屿的个数,当为0是结束程序,接着n-1行开始时为这岛屿的编号,用大写字母表示,接着是一个整数m,表示与该岛屿连接的字典序

道路交通英语 English for Roads and Transportation

COLLECTED FROM THE INTERNET 每日雅思 100个交通规则专用英语 交通规则  traffic regulation 路标    guide post 里程碑   milestone 停车标志  mark car stop 红绿灯   traffic light 自动红绿灯 automatic traffic signal light 红灯    red light 绿灯

poj1724--ROADS(最短路变形)

题目链接:点击打开链接 题目大意:给出n个点,m条路径(有向),每条边有一个花费和一个长度,要求在给定的花费内求1到n的最短路径 用dis[i][j]表示从1到i点,花费为j的最短路径,跑spfa,求出最短路 #include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace

poj3411--Paid Roads(bfs+状压)

题目链接:点击打开链接 题目大意:有n个点,m条有向边,经过边需要一个花费,a b c p q代表 a到b的一条道路,如果经过这条边之前经过c点,那么需要p的花费,否则需要q的花费,问从1点到n点的最小花费。 方法1、每条边可能会经过多次,每个点也可以经过多次,这样就没有了边界不能直接进行dfs,因为要记录之前经过的边,所以使用状压,dis[i][j]:当前在第i个点,j表示经过了的点,这样就

POJ 2421 Constructing Roads (MST)

题中给了n*n的矩阵,值是i点到j点的建边的花费,其中已经建好了m条边,题中求还需要花费多少才能使该图连通 思路:Kruskal更好做(并查集)。初始化之后,将m条边依次加入并查集,只要能合并及时合并。 /************************************************ Author: fisty* Created Time: 2015/2/28 14:04