每日一题(5):poj2485, Highways

来源:互联网 发布:webform做数据库分页 编辑:程序博客网 时间:2024/05/30 23:14

1.      题目很简单。一开始自己就写出来了,然后一直WA,不知道为啥,后来经过两个小时,发现了,就是越界。不知道就是memset不可用,然后自己用for复制。但是再边界用了等号。导致一直错。不知道为什么ide不报错。感觉这算是对C++不熟导致的问题了。

2.      还有memset,一定在看看。感觉教训惨痛。

3.      题目就不说了。很简单,很直接。直接最小生成树就可以了。

4.      freopen可以使用绝对路径,只要别写错了。

5.      codeblocks上面如果某个文件有红色的感叹号,一定是有更新但是没有保存。

6.      还有一点不同,就是原来觉得应该从最短的线段开始。后来发现其实不必。只需要从任意一点开始。因为程序会找到此点所在的最短线段,也许这条线段不是所有线段里面最短的,但是没有关系,因为早晚最短的线段会被纳入树中。所以一开始不需要找最短线段作为起始点。

7.      还有本题不是求最短路,求的是最小生成树里面的最长路。只需要稍加变通就可以。

8.   

568K

172MS

#include<iostream>#include<string>#include<string.h>#include<stdio.h>using namespace std;const int inf = 100000;const int maxSize = 501;int t;//测试数目int n;//村庄数目int dist[maxSize][maxSize];int prim(){    int min_w ;//目前的最短线段    int minWeight[maxSize];//每个点最小值的数组    bool flag[maxSize];//标记数组,看看某点是否访问过。    int result = 0;//返回结果。默认最小    int num=1;//已经在树种的点    int s = 1;//起始点。    int flagPoint;//下一次起始点    for(int i = 1; i < maxSize; i++)        minWeight[i] = inf;    for(int i = 1; i < maxSize; i++)        flag[i] = true;    flag[s] = false;    while(true)    {        if(num==n)            break;        min_w = inf;        for(int i = 2; i <=n; i++)    {        if(flag[i]&&minWeight[i]>dist[s][i])        {            minWeight[i] = dist[s][i];        }        if(flag[i]&&min_w>minWeight[i])        {            min_w = minWeight[i];            flagPoint = i;        }    }    num++;    s = flagPoint;    flag[s] = false;      if(result<min_w)    {         result = min_w;           }    }return result;}int main(){   //下面是输入测试文件    //freopen("C://Users/23192/Desktop/data2.in","r",stdin);    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        int minWeight2;        for(int i = 1; i <= n; i++)        {            for(int j = 1; j <= n; j++)            {                scanf("%d",&dist[i][j]);                //cout<<"测试:"<<dist[i][j]<<endl;            }        }        printf("%d\n",prim());    }}


0 0
原创粉丝点击