برای استفاده از تمام امکانات سایت از جمله مرکز دانلود باید در سایت عضو شوید. برای ثبت نام تنها 1 دقیقه زمان نیاز دارید ، برای ثبت نام اینجا کلیک کنید

صفحه اول انجمنها
ثبت نامجستجوراهنماي انجمنليست اعضااتاق چت (0)گروه هاي كاربرانمرکز دانلودورود

پاسخ به يك موضوع صفحه 1 از 2
برو به صفحه 1, 2  بعدي
طراحی الگوریتم
نويسنده پيغام

پاسخ بصورت نقل قول
ارسال طراحی الگوریتم 
فعلا دو تا کتاب داشته باشین:

http://www.aachp.ir/downloads/algorithms.pdf

این یکی زبونش سادس, کتاب خوبی هم است:

http://online-judge.uva.es/problemset/Art_of_Programming_Contest_SE_for_uva.pdf

حتما دانلود کنید چون باهاشون کار داریم Wink

منبع:www.aachp.ir



اين نامه توسط ملایی در شنبه Oct 13, 2007 9:31 pm ويرايش شده است.

_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال  
این کدی که نوشتم در مورد الگوریتم هافمنه  :  Huffman

چیز جالبی شد  Cool  , می زارم اینجا تا بقیه هم استفاده کنن:

code:
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;
struct node{
      int tekrar;
      string harf;
      node *l;
      node *r;
      node (){
         l=r=NULL;
         harf="";
      }
   };
vector < node* > v,v2;
void sort1(){//sorting on tekrar :D
   for (size_t i=0 ;i < v.size()-1;++i)
      for (size_t j=i+1 ; j < v.size() ; ++j )
         if ( v[i]->tekrar > v[j]->tekrar )
            swap ( v[i] , v[j] );
}
void sort2(){// sorting on harf
   for (size_t i=0 ;i < v2.size()-1;++i)
      for (size_t j=i+1 ; j < v2.size() ; ++j )
         if ( v2[i]->harf[0] > v2[j]->harf[0] )
            swap ( v2[i] , v2[j] );
}
void peymayesh(node *p){
   static string s="";
   static int i=0;
   p->harf += s;
   if (p->l){
      s+="0";
      peymayesh(p->l);
   }
   if (p->r){
      s+="1";
      peymayesh(p->r);
   }
   if (! s.empty() )
      s.erase(s.begin() + s.size() -1);
   else
      i=0;//for next use !! means next test case
   if (p->harf[0]>=97)
      v2[i++]=p;
}

int main (){
   ifstream in("Huffman.in");
   int t,n;
   for (in >> t;t>0;--t){
      v.clear();// for input and create tree
      v2.clear();// for output and calculate compressing volume
      in >> n ;
      v.assign(n,0);
      v2.assign(n,0);
      for (int i=0; i<n ; ++i){
         v[i]=new node;
         v2[i]=new node;
         in >> v[i]->harf >> v[i]->tekrar ;
      }
      int bits1= ceil( log((double)n )/ log((double)2 ) );
      int sum1 = 0 ;//regular coding
      for (int i=0 ; i<n ; ++i)
         sum1 += bits1 * v[i]->tekrar;
      node *p;
      while ( v.size() > 1 ){
         sort1();
         p=new node;
         p->l = v[0];
         p->r = v[1];
         p->tekrar = v[0]->tekrar + v[1]->tekrar;
         v[0]=p;
         v.erase(v.begin() + 1);
      }
      peymayesh(v[0]);
      sort2();
      for(int i=0;i<v2.size();++i){
         cout << v2[i]->harf[0] << ":";
         v2[i]->harf.erase(v2[i]->harf.begin());
         cout << v2[i]->harf <<" ";
      }
      cout<< endl;
      int sum2=0;//Huffman coding
      for (int i=0;i<n;++i)
         sum2+= v2[i]->harf.size() * v2[i]->tekrar;
      cout << "regular coding: " << sum1
         << " ,with Huffman coding: " << sum2 << endl << endl;
   }
   return 0;
}


اگه کسی سوالی داشته باشه خوشحال میشم بتونم کمکش کنم  Razz

ورودی اش هم مثلا اینجوریه :

code:
2
6
a 30
b 10
c 7
d 8
e 40
f 14
6
a 2000
b 1000
c 500
d 500
e 2000
f 2100




اين نامه توسط ملایی در 1 شنبه Jun 17, 2007 5:37 pm ويرايش شده است.

_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال  
اینم فروشنده دوره گرد به روش تقسیم و حل

فقط نمی دونم آرایه ای میشه به وسیله ی اون مسیر رو پیدا کرد چه جوری درست میشه.
code:
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
vector <int > s;
int **L,n;
int travelling ( int i ){
   if (s.empty())
      return L[i][0];
   int result = 100000 , distiaj , tempj;
   for (int j=0;j<s.size();++j){
      tempj = s[j];
      s.erase(s.begin() + j);
      distiaj = L[i][tempj] + travelling (tempj);
      s.insert(s.begin() + j , tempj );
      if ( distiaj < result )
         result = distiaj;
   }
   return result;
}

int main(){
   ifstream in("forushande_dore_gard.in");
   in >> n;
   L=new int *[n];
   for (int i=0;i<n;++i){
      L[i]=new int [n];
      for (int j=0;j<n;++j)
         in >> L[i][j];
   }
   for (int i=1;i<n;++i)
      s.push_back(i);
   int minsum = travelling (0);
   cout << "value of min path is: " << minsum << endl;
   return 0;
}

اینم ورودی اش :

code:
4
0 10 15 20
5 0 9 10
6 13 0 12
8 8 9 0



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال ضرب string ای ! 
با این code میشه اعداد خیلی بزرگ رو خیلی سریع در هم ضرب کرد . اعدادی که تو هیچ متغیر عددی جا نمیشن  Wink
code:

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
string zarb(string &a,string &b){
   reverse (a.begin(),a.end());
   reverse (b.begin(),b.end());
   string ans;
   ans.insert(0,1000,'0'); // inja mishe andazeye javab ro taghir dad
   int c=0;
   int i,j;
   for (i=0;i<a.size();++i){
      for (j=0;j<b.size();++j){
         if ( (ans[i+j]-48 + ((a[i]-48)*(b[j]-48)+c)%10) > 9 ){
            int carry=(ans[i+j]-48 + ((a[i]-48)*(b[j]-48)+c)%10) /10;
            ans[i+j] = (ans[i+j]-48 + ((a[i]-48)*(b[j]-48)+c)%10) %10 + 48;
            c=((a[i]-48)*(b[j]-48)+c)/10;
            int k=1;
            ans[i+j+k]+=carry;
            while ( ans[i+j+k]>'9' ){
               carry = (ans[i+j+k] - '0')/10;
               ans[i+j+k]= (ans[i+j+k]-48)%10 +'0';
               ++k;
               ans[i+j+k]+=carry;
            }
         }
         else{
            ans[i+j] += ((a[i]-48)*(b[j]-48)+c)%10;
            c = ((a[i]-48)*(b[j]-48)+c ) /10;
         }
      }
      ans[i+j]+=c;
      c=0;
   }
   for (int i=ans.size()-1;i>0;--i)
         if (ans[i]=='0')
             ans.erase (ans.end()-1);
         else
            break;
   reverse (ans.begin(),ans.end());
   return ans;
}
int main() {
    string s1,s2;
    cin >> s1 >> s2;
    cout << zarb(s1,s2) << endl;
    return 0;
}



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال  
این کد ماله پیدا کردن نقطه ی تقاطع دو پاره خطه !

اگه تقاطع نداشته باشن false بر میگردونه .

برای بررسی این که تقاطع دارن یه نه یه روش راحت تر و سریع تر هم هست ( بعدا میگم )

code:

bool intersect(point m,point b,point n,point c,point &O){ //4noghte az do pare khat midin mige barkhord daran ya na
    double y1=m.y-b.y ,x1=m.x-b.x;
    double y2=n.y-c.y ,x2=n.x-c.x;
    double xO , yO;
    if (x1==0){
        xO=b.x;
        yO=y2/x2*(xO-c.x)+c.y;
    }
    else if (x2==0){
        xO=c.x;
        yO=y1/x1*(xO-b.x)+b.y;
    }
    else {
        xO=( b.x*y1/x1 - c.x*y2/x2 + c.y-b.y ) * x1*x2/(x2*y1-x1*y2);
        yO=y1/x1*(xO-b.x)+b.y;
    }
O.x=xO;
O.y=yO;
if (xO>=min(m.x,b.x)-eps && xO<=max(m.x,b.x)+eps && xO>=min(n.x,c.x)-eps && xO<=max(n.x,c.x)+eps &&
        yO>=min(m.y,b.y)-eps  && yO<=max(m.y,b.y)+eps && yO>=min(n.y,c.y)-eps && yO<=max(n.y,c.y)+eps )
return true;
return false;
}



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال فاکتوریل و ترکیب 
code:
unsigned __int64 fact[19]={0};
__int64 factorial(__int64 a){
   if ( fact[a]!=0 )
      return fact [a];
   if (a==1){
      fact[a]=1;
      return 1;
   }
   fact[a] = a * factorial(a-1);
   return fact[a];
}


این هم ماله ترکیب :
code:
unsigned __int64 tark[19][19]={{0,0}};
__int64 tarkib ( __int64 n , __int64 i){
   if ( tark[n][i]!= 0 )
      return tark [n][i];
   if ( n==i || i==0 ){
      tark[n][i]=1;
      return 1;
   }
   tark[n][i] = tarkib( n-1 , i ) + tarkib ( n-1 , i-1 );
   return tark[n][i];
}



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال تبدیل مبنای 10 به 2 و همچنین محاسبه مساحت با کمک ضرب خارجی 
یه تابع بازگشتی نسبتا ساده و تیدیل مبنا :
code:
void tentotwo(int a){
   if (a/2==0){
      cout<<a; return;
   }
   int x=a%2; a/=2;
   tentotwo(a);
   cout<<x;
}

میشه به جای cout عدد ها رو بزاریم تو به آرایه و اگه لازم شد reverse اش کنیم.


اینم مال مساحت :

فقط نقطه های داخل آرایه (vector ) باید مرتب باشن ( یا ساعتگرد یا پادساعت گرد )
code:

struct point {
   double x,y;
   point(){}
   point (double a,double b){
      x=a,y=b;
   }
};

double ex_mult(point &a,point &b){
   return ((a.x*b.y)-(a.y*b.x));
}

for (int j=0;j<v[i].size();++j)
            sum += ex_mult( v[i] , v[(i+1)%v.size()] );
         cout << abs(sum)/2 << endl;



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال جدا کردن نقاط بیرونی 
فرض کنید تو vector<complex<double> > v یه عالمه ( مثلا500 تا ) نقطه ی تصادفی داریم .
اولین کار اینه که نقطه ها رو تو vector مرتب کنیم , با این تابع :
code:

bool cmd(complex<double> &p,complex<double> &q){
   if (p.real() != q.real())
      return p.real()<q.real();
   return p.imag()<q.imag();
}

بعد از یه همچین کدی میشه برای قرار دادن نقطه های بیرونی تو وکتور ans استفاده کرد.
توضیح این که هر نقطه ای که انتخاب میشه با چرخوندن دستگاه مختصات , بقیه ی نقطه ها رو تو ربع اول و چهارم قرار میده. ( اولین نقطه لازم نیست یعنی چون  ما اومدیم سمت چپ و پایین نقطه رو گذاشتیم اول v خودش اتومات این حالت رو داره )
code:
sort ( v.begin() , v.end() ,cmd );
      vector < complex<double> > ans;
      //complex <double > cur_p,first = v[0];
      ans.push_back(v[0]);
      double ang,temp_ang,rotate=0;
      int min_point=n-1,cnt_choice=0;
      while (min_point!=0){
         ang=1.0e+8;
         for (int i=0;i<n;++i){//temp_ang == #INF ?
            temp_ang=atan2( v[i].imag() - ans[cnt_choice].imag() , v[i].real() - ans[cnt_choice].real() );
            if (temp_ang==0)
               continue;
            temp_ang-=rotate;
            while (temp_ang < -PI/2 )
               temp_ang+=2*PI;
            if (temp_ang < ang ){
               min_point = i;
               ang=temp_ang;
            }
         }
         ans.push_back (v[min_point]);
         ++cnt_choice;
         rotate += PI/2 + ang ;//important !
         if (rotate >= 2*PI )
            rotate -= 2*PI;
      }


در ضمن این نطقه ها رو به صورت پادساعت گرد داخل ans  می زاره که خودش یک مزیت هست


_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال maxmimum network flow 
این مربوط به الگوریتم های گراف میشه . لینک زیر رو حتما نگاه کنین خوب توضیح داده :

http://en.wikipedia.org/wiki/Edmonds-Karp_algorithm
با تشکر از هادی مشیدی
code:

/**
 *   //////////////////
 *   // MAXIMUM FLOW //
 *   //////////////////
 *
 * This file is part of my library of algorithms found here:
 *      http://www.palmcommander.com:8081/tools/
 * LICENSE:
 *      http://www.palmcommander.com:8081/tools/LICENSE.html
 * Copyright (c) 2004
 * Contact author:
 *      igor at cs.ubc.ca
 **/

/****************
 * Maximum flow * (Ford-Fulkerson on an adjacency matrix)
 ****************
 * Takes a weighted directed graph of edge capacities as an adjacency
 * matrix 'cap' and returns the maximum flow from s to t.
 *
 * PARAMETERS:
 *      - cap (global): adjacency matrix where cap[u][v] is the capacity
 *          of the edge u->v. cap[u][v] is 0 for non-existent edges.
 *      - n: the number of vertices ([0, n-1] are considered as vertices).
 *      - s: source vertex.
 *      - t: sink.
 * RETURNS:
 *      - the flow
 *      - fnet contains the flow network. Careful: both fnet[u][v] and
 *          fnet[v][u] could be positive. Take the difference.
 *      - prev contains the minimum cut. If prev[v] == -1, then v is not
 *          reachable from s; otherwise, it is reachable.
 * DETAILS:
 * FIELD TESTING:
 *      - Valladolid 10330: Power Transmission
 *      - Valladolid 653:   Crimewave
 *      - Valladolid 753:   A Plug for UNIX
 *      - Valladolid 10511: Councilling
 *      - Valladolid 820:   Internet Bandwidth
 *      - Valladolid 10779: Collector's Problem
 * #include <string.h>
 * #include <queue>
 **/

#include <string.h>

// the maximum number of vertices
#define NN 1024

// adjacency matrix (fill this up)
int cap[NN][NN];

// flow network
int fnet[NN][NN];

// BFS
int q[NN], qf, qb, prev[NN];

int fordFulkerson( int n, int s, int t )
{
    // init the flow network
    memset( fnet, 0, sizeof( fnet ) );

    int flow = 0;

    while( true )
    {
        // find an augmenting path
        memset( prev, -1, sizeof( prev ) );
        qf = qb = 0;
        prev[q[qb++] = s] = -2;
        while( qb > qf && prev[t] == -1 )
            for( int u = q[qf++], v = 0; v < n; v++ )
                if( prev[v] == -1 && fnet[u][v] - fnet[v][u] < cap[u][v] )
                    prev[q[qb++] = v] = u;

        // see if we're done
        if( prev[t] == -1 ) break;

        // get the bottleneck capacity
        int bot = 0x7FFFFFFF;
        for( int v = t, u = prev[v]; u >= 0; v = u, u = prev[v] )
            bot <?= cap[u][v] - fnet[u][v] + fnet[v][u];

        // update the flow network
        for( int v = t, u = prev[v]; u >= 0; v = u, u = prev[v] )
            fnet[u][v] += bot;

        flow += bot;
    }

    return flow;
}

//----------------- EXAMPLE USAGE -----------------
int main()
{
    memset( cap, 0, sizeof( cap ) );
    int numVertices = 100;
   
    // ... fill up cap with existing edges.
    // if the edge u->v has capacity 6, set cap[u][v] = 6.       
   
    cout << fordFulkerson( numVertices, s, t ) << endl;
   
    return 0;
}



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال ترکیب , ب م م 
میاد ترکیب رو برای اعداد بزرگ محاسبه می کنه , gcd  هم داره.

code:
unsigned __int64 gcd(unsigned __int64 a,unsigned __int64 b) {
   if (a%b==0) return b; else return gcd(b,a%b);
}
void Divbygcd(unsigned __int64& a,unsigned __int64& b) {
   unsigned __int64 g=gcd(a,b);
   a/=g;
   b/=g;
}
unsigned __int64 C(int n,unsigned int k){
   unsigned __int64 numerator=1,denominator=1,toMul,toDiv,i;
   if (k>n/2) k=n-k; /* use smaller k */
   for (i=k;i;i--) {
      toMul=n-k+i;
      toDiv=i;
      Divbygcd(toMul,toDiv); /* always divide before multiply */
      Divbygcd(numerator,toDiv);
      Divbygcd(toMul,denominator);
      numerator*=toMul;
      denominator*=toDiv;
   }
   return numerator/denominator;
}



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال الگوریتم بهینه محاسبه یک مقدار خاص در تابع فیبوناتچی 
اینم به روش خیلی سریع تر با زمان لگاریتمی
code:

int Fib(int n)
{
    int i,h,j,k,t;
    i = h = 1;
    j = k = 0;
    while (n > 0)
    {
        if (n%2 == 1)
        {
            t = j*h;
            j = i*h + j*k + t;
            i = i*k + t;
        }
        t = h*h;
        h = 2*k*h + t;
        k = k*k + t;
        n = n/2;
    }
return j;
}


منبع : codecorona.com


_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی
نمايش نامه هاي ارسال شده قبلي:
پاسخ به يك موضوع صفحه 1 از 2
برو به صفحه 1, 2  بعدي