POJ

来源:互联网 发布:大学的意义知乎 编辑:程序博客网 时间:2024/04/30 05:16

题目链接-Til the Cows Come Home


思路:一看就是dijkstra来着,但是还是出现了不少错误。

1.memset函数使用时要包含头文件cstring

2.menset函数按位替换,所以直接memset个max是不行的。

3.

//for(int k =1;(!collected[k])&&k<=N;k++)        for(int k =1;k<=N;k++)if((!collected[k])&&dist[k]<min)
以上这一小段代码,要注意不能采用注释掉的那一种,逻辑不正确,举例:每次从第一个开始遍历,而第一个一定是被collected,直接弹出。事实上这句话需要的逻辑是,遇到收集过的直接跳过,而不是直接弹出,不再循环了。

4.

if (distance < graph[a][b]) graph[a][b]=graph[b][a]=distance;

在读入的时候一定要注意加上这个if判断,因为有可能有重路,取小的那个。


以下是完整代码:

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#define MAX 9999999using namespace std;typedef int vertax;int graph[1005][1005];int dist[1005];bool collected[1005];void dijkstra(int N){vertax v = 0;int min = MAX;dist[1] = 0;for(int j=1;j<=N;j++){min = MAX;//for(int k =1;(!collected[k])&&k<=N;k++)for(int k =1;k<=N;k++){if((!collected[k])&&dist[k]<min){min = dist[k];v = k;}}collected[v]=true;for(int m = 1;m<=N;m++){if((dist[v]+graph[v][m]<dist[m])){dist[m] = dist[v]+graph[v][m];}}}};int main(void){vertax a,b,N;int T,distance;cin>>T>>N;memset(graph,12,sizeof(graph));memset(dist,12,sizeof(dist));memset(collected,false,sizeof(collected));for(int j =0;j<T;j++){//create graphcin>>a>>b>>distance;if (distance < graph[a][b]) graph[a][b]=graph[b][a]=distance;}//dijkstradijkstra(N);//outputcout<<dist[N]<<endl;return 0;}


0 0
原创粉丝点击