Problem W
2016-07-05 17:58
239 查看
[align=left]Problem Description[/align]
In 12th Zhejiang College Students Games 2007, there was a new stadium built in Zhejiang Normal University. It was a modern stadium which could hold thousands of people. The audience Seats made a circle. The total number of columns
were 300 numbered 1--300, counted clockwise, we assume the number of rows were infinite.<br>These days, Busoniya want to hold a large-scale theatrical performance in this stadium. There will be N people go there numbered 1--N. Busoniya has Reserved several
seats. To make it funny, he makes M requests for these seats: A B X, which means people numbered B must seat clockwise X distance from people numbered A. For example: A is in column 4th and X is 2, then B must in column 6th (6=4+2).<br>Now your task is to
judge weather the request is correct or not. The rule of your judgement is easy: when a new request has conflicts against the foregoing ones then we define it as incorrect, otherwise it is correct. Please find out all the incorrect requests and count them
as R.<br>
[align=left]Input[/align]
There are many test cases:<br>For every case: <br>The first line has two integer N(1<=N<=50,000), M(0<=M<=100,000),separated by a space.<br>Then M lines follow, each line has 3 integer A(1<=A<=N), B(1<=B<=N), X(0<=X<300) (A!=B), separated
by a space.<br><br>
[align=left]Output[/align]
For every case: <br>Output R, represents the number of incorrect request.<br>
[align=left]Sample Input[/align]
10 10
1 2 150
3 4 200
1 5 270
2 6 200
6 5 80
4 7 150
8 9 100
4 8 50
1 7 100
9 2 100
[align=left]Sample Output[/align]
简单题意:
有编号为1-N的人在体育馆里,输入为 A B X ,代表二者之间的距离为X。然后给出一组数据,求出有多少错误的数据,即有冲突的数据,当前的关系与之前的关系有冲突。
解题思路形成过程:
运用并查集求出带权的树,这是核心的思想。并查集的代码模板可以完全胜任这个程序,所以问题也就自然而然的解决。关键是并查集的运用。
感想:
图论这个专题,其实新颖的东西并不多,只要掌握了核心,一招鲜吃遍天下。
AC代码:
#include<cstdio>
#include<cmath>
using namespace std;
#define N 50005
int f
, rank
, n, m;
void init(){
for(int i=0; i<=n; ++i)
f[i]=i, rank[i]=0;
}
int find(int x){
if(x==f[x]) return f[x];
int t=f[x];
f[x] = find(f[x]);
rank[x] += rank[t];
return f[x];
}
bool Union(int x,int y, int m){
int a=find(x), b=find(y);
if(a==b){
if(rank[x]+m!=rank[y])
return false;
return true;
}
f[b] = a;
rank[b] = rank[x]+m-rank[y];
return true;
}
int main(){
int a,b,x;
while(~scanf("%d%d",&n,&m)){
init();
int cnt=0;
for(int i=0; i<m; ++i){
scanf("%d%d%d",&a,&b,&x);
if(!Union(a, b, x)){
++cnt;
}
}
printf("%d\n",cnt);
}
return 0;
}
In 12th Zhejiang College Students Games 2007, there was a new stadium built in Zhejiang Normal University. It was a modern stadium which could hold thousands of people. The audience Seats made a circle. The total number of columns
were 300 numbered 1--300, counted clockwise, we assume the number of rows were infinite.<br>These days, Busoniya want to hold a large-scale theatrical performance in this stadium. There will be N people go there numbered 1--N. Busoniya has Reserved several
seats. To make it funny, he makes M requests for these seats: A B X, which means people numbered B must seat clockwise X distance from people numbered A. For example: A is in column 4th and X is 2, then B must in column 6th (6=4+2).<br>Now your task is to
judge weather the request is correct or not. The rule of your judgement is easy: when a new request has conflicts against the foregoing ones then we define it as incorrect, otherwise it is correct. Please find out all the incorrect requests and count them
as R.<br>
[align=left]Input[/align]
There are many test cases:<br>For every case: <br>The first line has two integer N(1<=N<=50,000), M(0<=M<=100,000),separated by a space.<br>Then M lines follow, each line has 3 integer A(1<=A<=N), B(1<=B<=N), X(0<=X<300) (A!=B), separated
by a space.<br><br>
[align=left]Output[/align]
For every case: <br>Output R, represents the number of incorrect request.<br>
[align=left]Sample Input[/align]
10 10
1 2 150
3 4 200
1 5 270
2 6 200
6 5 80
4 7 150
8 9 100
4 8 50
1 7 100
9 2 100
[align=left]Sample Output[/align]
2 <div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div> Hint: (PS: the 5th and 10th requests are incorrect) </div>
简单题意:
有编号为1-N的人在体育馆里,输入为 A B X ,代表二者之间的距离为X。然后给出一组数据,求出有多少错误的数据,即有冲突的数据,当前的关系与之前的关系有冲突。
解题思路形成过程:
运用并查集求出带权的树,这是核心的思想。并查集的代码模板可以完全胜任这个程序,所以问题也就自然而然的解决。关键是并查集的运用。
感想:
图论这个专题,其实新颖的东西并不多,只要掌握了核心,一招鲜吃遍天下。
AC代码:
#include<cstdio>
#include<cmath>
using namespace std;
#define N 50005
int f
, rank
, n, m;
void init(){
for(int i=0; i<=n; ++i)
f[i]=i, rank[i]=0;
}
int find(int x){
if(x==f[x]) return f[x];
int t=f[x];
f[x] = find(f[x]);
rank[x] += rank[t];
return f[x];
}
bool Union(int x,int y, int m){
int a=find(x), b=find(y);
if(a==b){
if(rank[x]+m!=rank[y])
return false;
return true;
}
f[b] = a;
rank[b] = rank[x]+m-rank[y];
return true;
}
int main(){
int a,b,x;
while(~scanf("%d%d",&n,&m)){
init();
int cnt=0;
for(int i=0; i<m; ++i){
scanf("%d%d%d",&a,&b,&x);
if(!Union(a, b, x)){
++cnt;
}
}
printf("%d\n",cnt);
}
return 0;
}
相关文章推荐
- 【Swift】从前台进入后台,从后台进入前台
- address already in use
- Linux下几种文件传输命令 sz rz sftp scp
- INVEST原则的应用
- Swift - 本地数据的保存与读取(使用NSCoder将对象保存到.plist文件)
- APP应用程序的生命周期
- Java学习笔记(十九):关于Random.nextInt()
- Swift开发中的一些琐碎
- 用Apache Ivy实现项目里的依赖管理
- 一天一条Linux指令-umount
- 阅读代码利器
- I/O空间-----I/O端口和I/O内存
- 深入浅出 RPC - 深入篇
- 团体程序设计天梯赛-练习集 L2-006. 树的遍历
- centos 安装mysql,启动时报错Starting MySQL.Manager of pid-file quit without updating file.[FAILED]
- MVC、MVP的理解
- Android仿小米商城商品详情界面UI,ScrollView嵌套ScrollView/WebView/ListView
- ie678,FF,chrome的css兼容性
- AOM+EXCEL 批量运行脚本的应用
- INVEST原则的应用