Bestcoder #53
15062 ワード
30分遅れて電話をかけたが、そうしないとrankはもっと見どころがいい......
1001 Rikka with Graph
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
点1が点nに直接接続されている場合、距離が最も短い.
1002 Rikka with Tree
異なる点と類似点を同時に満たすには、ノード数が等しく、各ノードからツリールート1までの距離がそれぞれ等しく(すなわち、深さがそれぞれ同じ)、親ノードが異なるノードが存在する.同一深さでのノード交換後に新たな構造が得られるか否かを判断するといえる.ある深さのノード数が1つ以上あると,ほぼ同層交換により新しい構造を得ることができる.
しかし、間違っています.いくつかのケースを適切に列挙すると,木の深さが2しかない場合,それは常に特殊であることが分かった.しかし、この判断を加えるとまだ足りない.さらに例を挙げると,ツリー上の非最下層に1つ以上のノードがあれば,新しい構造に変換できることが分かった.
これは、「1本の木が独特で、それぞれの深さにある任意の点数が1 1 1 1 1...1 xである場合」という問題解と一致する(個人的にはこの形態を「ほうき状」と呼ぶ)
1001 Rikka with Graph
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
/** Aug 29, 2015 7:39:29 PM
* PrjName:Bc53-01
* @author Semprathlon
*/
import java.io.*;
import java.util.*;
public class Main {
/**
* @param args
*/
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
StreamTokenizer in=new StreamTokenizer(new BufferedInputStream(System.in));
PrintWriter out=new PrintWriter(System.out);
while(in.nextToken()!=StreamTokenizer.TT_EOF){
int n=(int)in.nval;
in.nextToken();
int m=(int)in.nval;
boolean has=false;
//out.println(n+"-"+m);
for(int i=1;i<=m;i++){
in.nextToken();
int u=(int)in.nval;
in.nextToken();
int v=(int)in.nval;
if (u==1&&v==n||u==n&&v==1)
has=true;
}
if (has)
out.println(1+" "+n*(n-1)/2);
else
out.println(1+" "+1);
}
out.flush();
out.close();
}
}
点1が点nに直接接続されている場合、距離が最も短い.
1002 Rikka with Tree
異なる点と類似点を同時に満たすには、ノード数が等しく、各ノードからツリールート1までの距離がそれぞれ等しく(すなわち、深さがそれぞれ同じ)、親ノードが異なるノードが存在する.同一深さでのノード交換後に新たな構造が得られるか否かを判断するといえる.ある深さのノード数が1つ以上あると,ほぼ同層交換により新しい構造を得ることができる.
/** Aug 29, 2015 7:59:14 PM
* PrjName:Bc53-02
* @author Semprathlon
*/
import java.io.*;
import java.util.*;
public class Main {
/**
* @param args
*/
final static int maxn=2010;
static Graph G=new Graph(maxn);
static int[] dep;
static HashSet st=new HashSet();
static void bfs(int st){
Queue que=new LinkedList();
que.add(st);
while(!que.isEmpty()){
int u=que.poll();
for(int i=G.h[u];i>-1;i=G.edge[i].next){
int v=G.edge[i].to;
if (dep[v]>0) continue;
dep[v]=dep[u]+1;
que.add(v);
}
}
}
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
StreamTokenizer in=new StreamTokenizer(new BufferedInputStream(System.in));
PrintWriter out=new PrintWriter(System.out);
while(in.nextToken()!=StreamTokenizer.TT_EOF){
int n=(int)in.nval;
G.clear();
dep=new int[n+1];
dep[1]=1;
for(int i=1;iint u=(int)in.nval;
in.nextToken();
int v=(int)in.nval;
G.add(u, v);
G.add(v, u);
}
bfs(1);
boolean ans=true;
st.clear();
for(int i=1;i<=n;i++)
if (st.contains(dep[i])){
ans=false;
break;
}
else
st.add(dep[i]);
out.println(ans?"YES":"NO");
}
out.flush();
out.close();
}
}
class Edge{
int to,next;
Edge(int _u,int _v){
to=_u;next=_v;
}
}
class Graph{
int[] h;
int sz;
Edge[] edge;
Graph(int size){
sz=size;
h=new int[sz+1];
edge=new Edge[sz+1];
Arrays.fill(h, -1);
h[0]=0;
}
void clear(){
h=new int[sz+1];
edge=new Edge[sz+1];
Arrays.fill(h, -1);
h[0]=0;
}
void add(int u,int v){
edge[h[0]]=new Edge(v,h[u]);
h[u]=h[0]++;
}
}
しかし、間違っています.いくつかのケースを適切に列挙すると,木の深さが2しかない場合,それは常に特殊であることが分かった.しかし、この判断を加えるとまだ足りない.さらに例を挙げると,ツリー上の非最下層に1つ以上のノードがあれば,新しい構造に変換できることが分かった.
/** Aug 29, 2015 7:59:14 PM
* PrjName:Bc53-02
* @author Semprathlon
*/
import java.io.*;
import java.util.*;
public class Main {
/**
* @param args
*/
final static int maxn=2010;
static Graph G=new Graph(maxn);
static int[] dep;
static HashSet st=new HashSet();
static void bfs(int st){
Queue que=new LinkedList();
que.add(st);
while(!que.isEmpty()){
int u=que.poll();
for(int i=G.h[u];i>-1;i=G.edge[i].next){
int v=G.edge[i].to;
if (dep[v]>0) continue;
dep[v]=dep[u]+1;
que.add(v);
}
}
}
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
StreamTokenizer in=new StreamTokenizer(new BufferedInputStream(System.in));
PrintWriter out=new PrintWriter(System.out);
while(in.nextToken()!=StreamTokenizer.TT_EOF){
int n=(int)in.nval;
G.clear();
dep=new int[n+1];
dep[1]=1;
for(int i=1;iint u=(int)in.nval;
in.nextToken();
int v=(int)in.nval;
G.add(u, v);
G.add(v, u);
}
bfs(1);
boolean ans=true;
st.clear();
int maxd=0;
for(int i=1;i<=n;i++)
maxd=Math.max(dep[i], maxd);
for(int i=1;i<=n;i++)
if (st.contains(dep[i])){
if (dep[i]false;
break;
}
}
else
st.add(dep[i]);
if (maxd<3)
ans=true;
out.println(ans?"YES":"NO");
}
out.flush();
out.close();
}
}
class Edge{
int to,next;
Edge(int _u,int _v){
to=_u;next=_v;
}
}
class Graph{
int[] h;
int sz;
Edge[] edge;
Graph(int size){
sz=size;
h=new int[sz+1];
edge=new Edge[sz+1];
Arrays.fill(h, -1);
h[0]=0;
}
void clear(){
h=new int[sz+1];
edge=new Edge[sz+1];
Arrays.fill(h, -1);
h[0]=0;
}
void add(int u,int v){
edge[h[0]]=new Edge(v,h[u]);
h[u]=h[0]++;
}
}
これは、「1本の木が独特で、それぞれの深さにある任意の点数が1 1 1 1 1...1 xである場合」という問題解と一致する(個人的にはこの形態を「ほうき状」と呼ぶ)