zoukankan      html  css  js  c++  java
  • 2016年9月ccf

    去长沙理工考ccf。恰好又可以见闺蜜。

    前2道题很简单,第三题题目太长就跳过了【绕来绕去就像“你儿子是我儿子的爸爸一样头疼”】,就做第四题。但是还有最后一个部分没写写好就到点了。

    现在把它补充完整。

    我忘记怎么在函数参数中使用二维数组,所以直接把函数写在main里。

    分为2个部分,一个是求最短路径,一个是找出要改建的路。

    最短路径采用的是dijkstra算法。

    寻找要改建的路的部分。我一开始一直想要使用最小支撑树实现【即贪心算法】。但是我后来恍然发现,最后一个状态一定是每个城市都能以最短路径达到首都。那么a城市的最短路径就是与a相邻的某一个城市b的最短路径加上ab城市的距离。

    需要说明的是,我没有使用大量数据测试。

    仅供参考,如有错误,欢迎指正,共同学习。

      1 #include<iostream>
      2 #define far 1000
      3 using namespace std;
      4 int main()
      5 {
      6     int n,m,i,j,k;
      7     int sum=0;
      8     int x,y,z;
      9     cin>>n>>m;
     10     int a[n][n],edge[m];
     11     int visit[n],dis[n];
     12     for(i=0;i<n;i++)
     13     {
     14         for(j=0;j<n;j++)
     15         {
     16             a[i][j]=far;
     17         }
     18         visit[i]=0;
     19         dis[i]=far;
     20     }
     21     for(i=0;i<m;i++)
     22     {
     23         cin>>x>>y>>z;
     24         a[x-1][y-1]=a[y-1][x-1]=z;
     25         edge[i]=z;
     26     }
     27     for(i=0;i<n;i++)
     28     {
     29         for(j=0;j<n;j++)
     30             cout<<a[i][j]<<"  ";
     31         cout<<endl;
     32     }
     33     dis[0]=0;
     34     int v;
     35     for(i=0;i<n;i++)
     36     {
     37         for(j=0;j<n;j++)
     38         {
     39             if(visit[j]==0&&dis[j]!=far)
     40                 v=j;
     41         }
     42         for(j++;j<n;j++)
     43         {
     44             if((visit[j]==0)&&(dis[j]<v))
     45                 v=j;
     46         }
     47         visit[v]=1;
     48         for(j=0;j<n;j++)
     49         {
     50             if(dis[j]>dis[v]+a[v][j])
     51                 dis[j]=dis[v]+a[v][j];
     52         }
     53 
     54     }
     55     for(j=0;j<n;j++)
     56             cout<<dis[j]<<"   ";
     57         cout<<endl;
     58 
     59 
     60     for(i=0;i<n;i++)
     61         visit[i]=0;
     62 
     63     visit[0]=1;
     64     for(i=0;i<n;i++)
     65     {
     66         for(j=0;j<m;j++)
     67         {
     68             if(edge[j]==dis[i])
     69             {
     70                 cout<<"改变的边--"<<edge[j]<<endl;
     71                 sum=sum+edge[j];
     72                 edge[j]=0;
     73                 visit[i]=1;
     74             }
     75         }
     76     }
     77     for(i=0;i<n;i++)
     78     {
     79         if(visit[i]==0)
     80         {
     81             for(j=0;j<n;j++)
     82             {
     83                 if(dis[j]+a[i][j]==dis[i])
     84                 {
     85                     for(int k=0;k<m;k++)
     86                     {
     87                         if(edge[k]==a[i][j])
     88                         {
     89                             cout<<"改变的边--"<<edge[k]<<endl;
     90                             sum=sum+edge[k];
     91                             edge[k]=0;
     92                             visit[i]=1;
     93                             break;
     94                         }
     95                     }
     96                 }
     97             }
     98         }
     99     }
    100     cout<<endl<<"sum---"<<sum<<endl;
    101     cout<<"visit"<<endl;
    102     for(i=0;i<n;i++)
    103         cout<<visit[i]<<"  ";
    104     return 0;
    105 
    106 }
    View Code

    因为没有注释,可能比较难看懂。不懂的地方,也欢迎和我交流。

  • 相关阅读:
    另一种逆元的求解方法
    SSHFS使用笔记
    HDU 2612 Find a way (BFS)
    POJ 3984 迷宫问题 (BFS + Stack)
    计蒜客 疑似病毒 (AC自动机 + 可达矩阵)
    HUD 1426 Sudoku Killer (DFS)
    计蒜客 成绩统计 (Hash表)
    计蒜客 劫富济贫 (Trie树)
    POJ 2251 Dungeon Master (BFS)
    [IB]Integration Broker 是如何处理传入的请求(Part 2)
  • 原文地址:https://www.cnblogs.com/zhenzhenhuang/p/5873609.html
Copyright © 2011-2022 走看看