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. 如果由你来设计 12306.cn,你会怎么设计?

    作者:huangkun链接:https://www.zhihu.com/question/20017917/answer/15272038来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  2. 【01】emmet系列之基础介绍

    [01]emmet系列之基础介绍 [02]emmet系列之HTML语法 [03]emmet系列之CSS语法 [04]emmet系列之编辑器 [05]emmet系列之各种缩写 相关网址 官网:http: ...

  3. 将cocos2dx 2.x.x从eclipse转移到Android Studio遇到的问题

    cocos2dx 2.x.x从eclipse转移到Android Studio遇到的问题 可能我用不太习惯Android Studio才会遇到这么多问题,让老手们见笑了. cocos2dx的最新版本, ...

  4. 全文索引(A-1)-用户数据收集(用户研究)

    推荐系统根据用户的信息和历史行为记录,构造出用户的个性化模型,再依据特定的推荐算法,向用户推荐其可能感兴趣的项目. 如何获取用户的偏好? 建议用户对一些指定项目进行评分,如对:小说.传记.技术书.图画 ...

  5. Amoeba新版本MYSQL读写分离配置

    标签:mysql 数据库 读写分离 休闲 amoeba 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://skyson.blog.5 ...

  6. [luoguP1082] 同余方程(扩展欧几里得)

    传送门 ax≡1(mod b) 这个式子就是 a * x % b == 1 % b 相当于 a * x - b * y == 1 只有当 gcd(a,b) == 1 时才有解,也就是说 ax + by ...

  7. 【数轴涂色+并查集路径压缩+加速】C. String Reconstruction

    http://codeforces.com/contest/828/problem/C [题意] [思路] 因为题目保证一定有解,所有优化时间复杂度的关键就是不要重复染色,所以我们可以用并查集维护区间 ...

  8. 51Nod——T 1686 第K大区间

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 ...

  9. SecureCRT在Tab下的Title显示IP

    注意:要针对每个Session进行修改才行. 参考: http://www.cnblogs.com/tyhmj/archive/2013/12/20/3483247.html

  10. JSP的Cookie处理

    以下内容引用自http://wiki.jikexueyuan.com/project/jsp/Cookies-handling.html: Cookies是存储在客户端计算机的文本文件,保存各种跟踪目 ...