Wednesday, October 13, 2010

Модтой тоглоё 3 4

Бодлого
Мод гэдэг нь чиглэлгүй, дурын 2 оройн хооронд яг ганц л янзын зам олддог(нэг л маршрутаар очиж болдог) цикл агуулагүй (бүх оройн хувьд өөрөөсөө гараад өөр дээрээ ирдэг зам олдох ёсгүй) холбоост (дурын оройгоос дурын оройд очиж болдог) графыг мод гэнээ. Өөрөөр хэлбэл цикл агуулаагүй бүх холбоост графыг мод гэнээ гэж ойлгож болно. N оройтой граф байхад циклгүй холбоост граф болгохын тулд N-1 ирмэг татна. Бодлогоо бодохын тулд графын нэвтрэлтүүд болох түвшний нэвтрэлт, гүний нэвтрэлт аль альныг нь ашиглаж болно. Нэвтрэлт хийгээд бүх орой дээр хүрсэн эсэхийг шалгахад л хангалттай. Энэ гайгүй бодлого болохоор сурч аваарай гээд :D код тавив. Нээрээ өөр нэмэлт маягаар хэлэхэд энэ бодлогыг бас Disjiont Union өгөгдлийн бүтэц ашиглаж бодож болно.
Гүний нэвтрэлт хийсэн бодолт:
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<set>
using namespace std;
#define Max 10000
vector<int>a[Max+1];
bool visited[Max+1];
int n,m;
bool istree(){
for(int i=1;i<=n;i++)if(visited[i]==0)return false;
return true;
}
int DFS(int i){
vector<int>::iterator it;
visited[i]=1;
for(it=a[i].begin();it<a[i].end();it++){
if(visited[*it]==0)DFS(*it);
}
}
int main(){
//freopen("yi.txt","r",stdin);
//freopen("yo.txt","w",stdout);
scanf("%d%d",&n,&m);
if(m>=n){printf("NO\n");return 0;}
while(m--){
int u,v;
scanf("%d%d",&u,&v);
a[u].push_back(v);
a[v].push_back(u);
}
DFS(1);
if(istree())printf("YES\n");
else printf("NO\n");
return 0;}

Түвшний нэвтрэлт хийсэн бодолт:
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<set>
using namespace std;
#define Max 100001
queue<int>q;
vector< int >a[Max+1];
bool visited[Max+1];
int n,m;
bool istree(){
for(int i=1;i<=n;i++)if(visited[i]==0)return false;
return true;
}
int main(){
memset(visited,sizeof(visited),0);
//freopen("in11.txt","r",stdin);
//freopen("out11.txt","w",stdout);
scanf("%d%d",&n,&m);
if(m>=n){printf("Mod bish\n");return 0;}
while(m--){
int u,v;
scanf("%d %d",&u,&v);
a[u].push_back(v);
a[v].push_back(u);
}
q.push(1);
while(q.size()){
int l=q.front();
visited[l]=1;
q.pop();
vector<int>::iterator it;
for(it=a[l].begin();it<a[l].end();it++)
if(visited[*it]==0){
visited[*it]=1;
q.push(*it);
}
}
if(istree())printf("Mod\n");
else printf("Mod bish\n");
return 0;}

Модтой тоглоё 4
Дурын оройгоос Түвшний нэвтрэлт хийж хамгийн сүүлд очих навчнаас дахин Түвшний нэвтрэлт хийж хамгийн сүүлд очих навч хүртлэх ирмэгүүдийн тоо хариу болно.

No comments:

Post a Comment