题意:有T条路径,N个点,问从点N到点1的最短路径
有重边。。。
dijkstra算法
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 1<<30
const int N=1005;
bool vis[N];
int map[N][N],dis[N];
int main()
{
int n,t;
scanf("%d%d",&t,&n);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) map[i][j]=INF;
for(int i=0;i<t;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
map[a][b]=min(map[a][b],c);
map[b][a]=min(map[b][a],c);
}
dis[1]=0;
for(int i=2;i<=n;i++)
{
if(map[1][i]) dis[i]=map[1][i];
}
for(int i=1;i<n;i++)
{
int imin=INF,pos=0;
for(int j=2;j<=n;j++)
{
if(imin>dis[j]&&!vis[j])
{
imin=dis[j];pos=j;
}
}
vis[pos]=1;
for(int j=2;j<=n;j++)
{
if(dis[j]>dis[pos]+map[pos][j]&&!vis[j]) dis[j]=dis[pos]+map[pos][j];
}
}
printf("%d\n",dis[n]);
return 0;
}
spfa
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int N=1005;
bool vis[N];
int next[N],dis[N];
struct node
{
int x,y,w,next;
void fun(int a,int b,int c,int d){x=a;y=b;w=c;next=d;}
}edge[N*4];
int main()
{
int t,n,all=1;
scanf("%d%d",&t,&n);
memset(dis,0x7f,sizeof(dis));
dis[1]=0;
for(int i=1;i<=t;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
edge[all].fun(a,b,c,next[a]);
next[a]=all++;
edge[all].fun(b,a,c,next[b]);
next[b]=all++;
}
queue<int> que;
que.push(1);vis[1]=1;
while(!que.empty())
{
int to=que.front();
que.pop();vis[to]=0;
for(int i=next[to];i>0;i=edge[i].next)
{
int x=edge[i].x,y=edge[i].y,w=edge[i].w;
if(dis[y]>dis[x]+w)
{
dis[y]=dis[x]+w;
if(!vis[y]) {vis[y]=1;que.push(y);}
}
}
}
printf("%d\n",dis[n]);
return 0;
}