1003:

并查集在处理矛盾关系的应用,讲的比较好的题解

#include <map>
#include <set>
#include <list>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <vector>
#include <bitset>
#include <cstdio>
#include <string>
#include <numeric>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};//up down left right
bool inmap(int x,int y,int n,int m){if(x<1||x>n||y<1||y>m)return false;return true;}
int hashmap(int x,int y,int m){return (x-1)*m+y;} #define eps 1e-8
#define inf 0x7fffffff
#define debug puts("BUG")
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define read freopen("in.txt","r",stdin)
#define write freopen("out.txt","w",stdout)
#define N 11111 map<int,int>mp;
struct node
{
int l,r;
char c;
}nd[N>>1];
int fa[N<<1];
int find(int x)
{
if (fa[x]!=x)
fa[x] = find(fa[x]);
return fa[x];
} int gao(int m,int cnt)
{
for (int i = 0; i < m; ++i)
{
int l = mp[nd[i].l-1], r= mp[nd[i].r];
char c = nd[i].c;
int f1 = find(l), f2 = find(r), f3 = find(l+cnt), f4 = find(r+cnt);
if (c == 'e')
{
if (f1 == f4 && f2 == f3)
return i;
fa[f1] = f2;
fa[f3] = f4;
}
else
{
if (f1 == f2)
return i;
fa[f1] = f4;
fa[f2] = f3;
}
}
return m;
}
int main()
{
//read;
int n,m;
while (~scanf("%d",&n))
{
if (n == -1) break;
scanf("%d",&m);
mp.clear();
int l, r, cnt = 0;
char str[11];
for (int i = 0; i < m; ++i)
{
scanf("%d%d%s",&l,&r,str);
nd[i].l = l, nd[i].r = r;
nd[i].c = str[0];
if (mp.find(l-1) == mp.end())
mp[l-1] = cnt++;
if (mp.find(r) == mp.end())
mp[r] = cnt++;
}
for (int i = 0; i < 2*cnt; ++i)
fa[i] = i;
int ans = gao(m,cnt);
printf("%d\n", ans);
}
return 0;
}

 

1004:

能够加深对floyd理解的好题,当然还有另外的做法

#include <map>
#include <set>
#include <list>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <vector>
#include <bitset>
#include <cstdio>
#include <string>
#include <numeric>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};//up down left right
bool inmap(int x,int y,int n,int m){if(x<1||x>n||y<1||y>m)return false;return true;}
int hashmap(int x,int y,int m){return (x-1)*m+y;} #define eps 1e-8
#define inf 0x7ffffff
#define debug puts("BUG")
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define read freopen("in.txt","r",stdin)
#define write freopen("out.txt","w",stdout)
#define N 155
int mp[N][N];
int dis[N][N];
int nxt[N][N];
stack<int>st;
int floyd(int n)
{
int ans = inf;
for (int k = 1; k <= n; ++k)
{
for (int i = 1; i < k; ++i)
for (int j = i+1; j < k; ++j)
{
if (ans > dis[i][j] + mp[k][i] + mp[j][k])
{
ans = dis[i][j] + mp[k][i] + mp[j][k];
while (!st.empty())
st.pop();
for (int t = i; t != j; t = nxt[t][j])
st.push(t);
st.push(j);
st.push(k);
}
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
{
if (dis[i][k] == inf || dis[k][j] == inf)
continue;
if (dis[i][k] + dis[k][j] < dis[i][j])
{
dis[i][j] = dis[i][k] + dis[k][j];
nxt[i][j] = nxt[i][k];
}
}
}
return ans;
}
int main()
{
//read;
int n,m;
while (~scanf("%d",&n))
{
if (n == -1)break;
scanf("%d",&m);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
{
dis[i][j] = mp[i][j] = inf;
nxt[i][j] = j;
}
int u,v,c;
for (int i = 0; i < m; ++i)
{
scanf("%d%d%d",&u, &v, &c);
if (mp[u][v] > c)
mp[u][v] = mp[v][u] = dis[u][v] = dis[v][u] = c;
}
int ans = floyd(n);
//printf("%d\n",ans);
if (ans == inf)
puts("No solution.");
else
{
bool f = false;
while (!st.empty())
{
if (f) printf(" ");
else f = true;
printf("%d",st.top());
st.pop();
}puts("");
}
}
return 0;
}

URAL 1003,1004的更多相关文章

  1. SOJ 1002/1003/1004 大整数相加/相乘/相除

    三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反 ...

  2. 51Nod 1003 1004 1009

    1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1 ...

  3. URAL - 1003:Parity (带权并查集&2-sat)

    Now and then you play the following game with your friend. Your friend writes down a sequence consis ...

  4. 要back的题目 先立一个flag

    要back的题目 目标是全绿!back一题删一题! acmm7 1003 1004 acmm8 1003 1004 sysu20181013 Stat Origin Title Solved A Gy ...

  5. mysql语句查询练习

                                                                     1.创建students表mysql> create table ...

  6. 2016ACM/ICPC亚洲区大连站-重现赛(感谢大连海事大学)(7/10)

    1001题意:n个人,给m对敌对关系,X个好人,Y个坏人.现在问你是否每个人都是要么是好人,要么是坏人. 先看看与X,Y个人有联通的人是否有矛盾,没有矛盾的话咋就继续遍历那些不确定的人关系,随便取一个 ...

  7. PHP数组合并+与array_merge的区别分析 & 对多个数组合并去重技巧

    PHP中两个数组合并可以使用+或者array_merge,但之间还是有区别的,而且这些区别如果了解不清楚项目中会要命的! 主要区别是两个或者多个数组中如果出现相同键名,键名分为字符串或者数字,需要注意 ...

  8. POJ推荐50题

    此文来自北京邮电大学ACM-ICPC集训队 此50题在本博客均有代码,可以在左侧的搜索框中搜索题号查看代码. 以下是原文: POJ推荐50题1.标记“难”和“稍难”的题目可以看看,思考一下,不做要求, ...

  9. 为什么operator>>(istream&, string&)能够安全地读入长度未知的字符串?

    一般而言,实现"读入用户输入的字符串",程序中自然不能对用户输入的长度有所限定.这在C++中很容易实现,而在C中确没那么容易. 这一疑问,我在刚学C++的时候也在脑中闪现过:不过很 ...

随机推荐

  1. CSU 2018年12月月赛 A 2213: Physics Exam

    Description 高中物理老师总认为给学生文本形式的问题比给纯计算形式的问题要求更高.毕竟,学生首先得阅读和理解问题. 因此,他们描述一个问题不像”U=10V,I=5A,P=?”,而是”有一个含 ...

  2. AD转换器的主要指标

    AD转换器的主要指标如下: (1)分辨率(Resolution).指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与2n的比值.分辨率又称精度,通常以数字信号的位数来表示.定义满刻度于2^n的比 ...

  3. 洛谷 1850 NOIP2016提高组 换教室

    [题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...

  4. 2014-4-5安装python以及基础知识

    1.下载安装 从python官网下载python2.7.6 https://www.python.org/download/releases/2.7.6 建议用迅雷下载 会比较快 2.交互式解释器 运 ...

  5. 使用JS对form的内容验证失败后阻止提交

    1.form的两个事件 submit,提交表单,如果直接调用该函数,则直接提交表单 onSubmit,提交按钮点击时先触发,然后触发submit事件.如果不加控制的话,默认返回true,因此表单总能提 ...

  6. Webdriver元素定位3(CSS)

    Selenium极力推荐使用CSS 定位,而不是XPath来定位元素,原因是CSS 定位比XPath 定速度快,语法也更加简洁. CSS常用定位方法 选择器 例子 描述 .class .intro c ...

  7. 添物不花钱学JavaEE(基础篇)-综述

    JavaEE由一堆基础标准组成.JavaEE开发一般需要如下工具和掌握如下内容: Java环境 Eclipse或其他开发工具 Tomcat容器或类似软件 Jsp/Servlet/Web/JDBC的掌握 ...

  8. 添物不花钱学JavaEE(基础篇)- Servlet

    Servlet是Java Web开发必须要掌握的. Servlet是什么? A servlet is a Java technology based web component, managed by ...

  9. 如何实现IIS 7.0对非HTTP协议的支持

    在<再谈IIS与ASP.NET管道>介绍各种版本的IIS的设计时,我们谈到IIS 7.0因引入WAS提供了对非HTTP协议的支持.这个对于WCF的服务寄宿来说意义重大,它意味着我们通过II ...

  10. mysql proxy讀寫分流(二)-加入RW splitting

    上一篇中提到 安裝LUA及MySQL Proxy後,接下來就是RW splitting(讀寫分流)的部份了 整體的概念圖跟上一篇MySQL Proxy安裝方式相同,丫忠再補上一個對應port的圖表: ...