Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 39985 | Accepted: 13595 |
Description
Input
Output
Sample Input
5 5 1 2 20 2 3 30 3 4 20 4 5 20 1 5 100
Sample Output
90
题意:输入了N和T,输入的T组数据,三个数分别代表从 i 点到 j 点的距离。求出从第一点到N点的最短距离,
思路:比较裸的的Dijkstra,然后趁机模拟了一遍Dijkstra算法,
代码”:#include<iostream> #include<cstdio> #include<cstring> #define MAXN 2003 using namespace std; int T,N; int dis[MAXN][MAXN]; //储存距离的邻接矩阵 int cost[MAXN]; //存放距离 bool vis[MAXN]; //用于标记当前点是否遍历过 void Dijkstra(int start) { for(int i=1;i<=N;i++) cost[i]=dis[start][i]; memset(vis,0,sizeof(vis)); vis[start]=true;cost[start]=0; for(int i=1;i<=N;i++) { int NM=0x7ffffff,k; //设置NM为一个很大的值是为了松弛, for(int j=1;j<=N;j++) { if(!vis[j] && NM>cost[j]) { NM=cost[j]; //找出从这个点到其他邻接点的最短距离,并记下这个距离 k=j; } } vis[k]=true; //标记这个点已经遍历过 for(int j=1;j<=N;j++) { if(!vis[j] && cost[j]>(dis[k][j]+cost[k]) ) cost[j]=dis[k][j]+cost[k]; //这个每次更新了到目标点的距离 保证是最短距离 } } } int main() { memset(dis,10,sizeof(dis)); scanf("%d%d",&T,&N); for(int i=1;i<=N;i++) dis[i][i]=0; for(int i=1;i<=T;i++) { int x,y,len; scanf("%d%d%d",&x,&y,&len); dis[x][y]=dis[y][x]=min(len,dis[x][y]); //如果多次输入同一条边,取其最小值 } Dijkstra(1); printf("%d\n",cost[N]); return 0; }