本题为经典的dij算法,刚开始想的时候,想偷懒用floyd来做,发现超时,只有使用dij来做,另外注意有重复边现象,每次都选最小的边来做,有贪心的思维,并且注意这是一个无向图;
下面见ac代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000+10;
const int INF=100000000;
int v[maxn][maxn],dis[maxn],vis[maxn];
int n,t;
void dij(int x)
{
for(int i=1;i<=n;i++)
dis[i]=v[x][i];
dis[x]=0;vis[x]=1;
for(int i=1;i<n;i++)
{
int sum=INF,u=-1;
for(int j=1;j<=n;j++)
if(!vis[j]&&dis[j]<=sum)
sum=dis[u=j];
vis[u]=1;
for(int j=1;j<=n;j++)
if(!vis[j]&&dis[j]>dis[u]+v[u][j])
dis[j]=dis[u]+v[u][j];
}
}
void init()
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
v[i][j]=i==j?0:INF;
}
int main()
{
int a,b,c;
// freopen("A.txt","r",stdin);
scanf("%d %d",&t,&n);
init();
while(t--)
{
scanf("%d %d %d",&a,&b,&c);
v[a][b]=min(v[a][b],c);
v[b][a]=min(v[b][a],c);
}
dij(n);
printf("%d\n",dis[1]);
return 0;
}