思路:一看就是dijkstra来着,但是还是出现了不少错误。
2.menset函数按位替换,所以直接memset个max是不行的。
//for(int k =1;(!collected[k])&&k<=N;k++)
for(int k =1;k<=N;k++)
if((!collected[k])&&dist[k]<min)
以上这一小段代码,要注意不能采用注释掉的那一种,逻辑不正确,举例:每次从第一个开始遍历,而第一个一定是被collected,直接弹出。事实上这句话需要的逻辑是,遇到收集过的直接跳过,而不是直接弹出,不再循环了。
if (distance < graph[a][b]) graph[a][b]=graph[b][a]=distance;
在读入的时候一定要注意加上这个if判断,因为有可能有重路,取小的那个。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define MAX 9999999
using 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 graph
cin>>a>>b>>distance;
if (distance < graph[a][b]) graph[a][b]=graph[b][a]=distance;
}
//dijkstra
dijkstra(N);
//output
cout<<dist[N]<<endl;
return 0;
}