Advertisement
Guest User

Untitled

a guest
Nov 29th, 2014
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.38 KB | None | 0 0
  1. //ANS : 259679
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstdio>
  5. #include <string>
  6. #include <cstring>
  7. using namespace std;
  8.  
  9. int all_vertex_and_edge[40][40];
  10.  
  11. unsigned long long set_name;
  12.  
  13. void merg_sort_of_edges(int ara[][3],int len)
  14. {
  15.     if(len==1)
  16.         return ;
  17.     int l,i;
  18.     l=len/2;
  19.     int ara1[l][3],ara2[len-l][3];
  20.     for(i=0;i<l;i++){
  21.         ara1[i][0]=ara[i][0];
  22.         ara1[i][1]=ara[i][1];
  23.         ara1[i][2]=ara[i][2];
  24.     }
  25.     for(;i<len;i++){
  26.         ara2[i-l][0]=ara[i][0];
  27.         ara2[i-l][1]=ara[i][1];
  28.         ara2[i-l][2]=ara[i][2];
  29.     }
  30.     merg_sort_of_edges(ara1,l);
  31.     merg_sort_of_edges(ara2,len-l);
  32.     int j,k;
  33.     j=k=0;
  34.     for(i=0;i<len;i++){
  35.         if(j<l && k<len-l){
  36.             if(ara1[j][0]<ara2[k][0]){
  37.                 ara[i][0]=ara1[j][0];
  38.                 ara[i][1]=ara1[j][1];
  39.                 ara[i][2]=ara1[j][2];
  40.                 j++;
  41.             }
  42.             else{
  43.                 ara[i][0]=ara2[k][0];
  44.                 ara[i][1]=ara2[k][1];
  45.                 ara[i][2]=ara2[k][2];
  46.                 k++;
  47.             }
  48.         }
  49.         else if(j<l){
  50.             ara[i][0]=ara1[j][0];
  51.             ara[i][1]=ara1[j][1];
  52.             ara[i][2]=ara1[j][2];
  53.             j++;
  54.         }
  55.         else{
  56.             ara[i][0]=ara2[k][0];
  57.             ara[i][1]=ara2[k][1];
  58.             ara[i][2]=ara2[k][2];
  59.             k++;
  60.         }
  61.     }
  62.     return ;
  63. }
  64. int own_stoi(string s,int start=0,int base=10)
  65. {
  66.     return strtol(s.substr(start).c_str(),0,base);
  67. }
  68. void process(char *str,int n)
  69. {
  70.     string s=str;
  71.     size_t x;
  72.     int i=0,m=0;
  73.     while(1){
  74.         if(str[i]=='-')
  75.             all_vertex_and_edge[n][m]=-1;
  76.         else
  77.             all_vertex_and_edge[n][m]=own_stoi(s,i);
  78.         x=s.find(",",i);
  79.         if(x==string::npos)
  80.             break;
  81.         else{
  82.             i=x+1;
  83.             m+=1;
  84.         }
  85.     }
  86. }
  87. void merg_set(int *ara,int x1,int x2)
  88. {
  89.     if(x1<0 && x2<0){
  90.         ara[x1]=ara[x2]=set_name++;
  91.         return ;
  92.     }
  93.     if(x1<0){
  94.         ara[x1]=ara[x2];
  95.         return ;
  96.     }
  97.     if(x2<0){
  98.         ara[x2]=ara[x1];
  99.         return ;
  100.     }
  101.     int i,p;
  102.     p=ara[x1];
  103.     for(i=0;i<40;i++)
  104.         if(ara[i]==p)
  105.             ara[i]=ara[x2];
  106.     return ;
  107. }
  108. int main(void)
  109. {
  110.     FILE *fp;
  111.     if((fp=fopen("network.txt","rb"))==NULL){
  112.         printf("Cannot open file.\n");
  113.         exit(1);
  114.     }
  115.     char str[1000];
  116.     int i,j;
  117.     for(i=0;i<40;i++){
  118.         fgets(str,999,fp);
  119.         process(str,i);
  120.     }
  121.     fclose(fp);
  122.     set_name=0;
  123.     unsigned long long total_maximum_cost=0,minimum=0;
  124.     int x=0,edges[600][3];
  125.     for(i=0;i<40;i++)
  126.         for(j=i+1;j<40;j++)
  127.         if(all_vertex_and_edge[i][j]!=-1){
  128.             total_maximum_cost+=all_vertex_and_edge[i][j];
  129.             edges[x][0]=all_vertex_and_edge[i][j];
  130.             edges[x][1]=i;
  131.             edges[x][2]=j;
  132.             x++;
  133.         }
  134.     int p=0;
  135.     merg_sort_of_edges(edges,x);
  136.     int list_of_vertex[40];
  137.     for(i=0;i<40;i++)
  138.         list_of_vertex[i]=-(i+1);
  139.     for(i=0;edges[i][0]!=-1 && p<39;i++){
  140.         if(list_of_vertex[edges[i][1]]==list_of_vertex[edges[i][2]])
  141.             continue;
  142.         minimum+=edges[i][0];
  143.         p++;
  144.         merg_set(list_of_vertex,edges[i][1],edges[i][2]);
  145.     }
  146.     cout<<total_maximum_cost-minimum<<endl;
  147.     return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement