首先能容易想到用Floyd写个暴力(20分)
#include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<cmath> #define INF 0x3f3f3f3f using namespace std; const int maxn = 50000; int d[1000][1000]; int n,m; int main() { int x,y,z; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=INF; for(int i=1;i<=n;i++)d[i][i]=0; for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); d[x][y]=z; d[y][x]=z; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(d[i][j]>d[i][k]+d[k][j])d[i][j]=d[i][k]+d[k][j]; printf("%d",d[1][n]); return 0; }
#include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int maxn = 30000+5; struct edge{int y;int t;int next;}e[150000*2+5]; int n,m,k=1; int head[maxn],vis[maxn],dis[maxn]; queue<int> q; void adde(int x,int y,int z) { e[k].y=y; e[k].t=z; e[k].next=head[x]; head[x]=k++; } int main() { scanf("%d %d",&n,&m); int x,y,z; memset(head,-1,sizeof(head)); for(int i=1;i<=n;i++)dis[i]=1e9; for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); adde(x,y,z); adde(y,x,z); } dis[1]=0; vis[1]=1; q.push(1); int p = 0; while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; for(int tmp=head[u];tmp!=-1;tmp=e[tmp].next) { p = e[tmp].y; if(dis[p]>dis[u]+e[tmp].t) { dis[p] = dis[u] + e[tmp].t; if(!vis[p]) { q.push(p); vis[p]=1; } } } } printf("%d",dis[n]); return 0; }本题最优解法是dijkstra:
#include<cstdio> #include<cstring> #include<queue> #define inf 0x3f3f3f3f using namespace std; typedef pair<int,int> pii; priority_queue<pii,vector<pii>,greater<pii> >q; struct edge{ int x,z,next; }e[300005]; int n,m,f[30005],vis[30005],tot=1,head[30005]; void adde(int u,int x,int z) { e[tot].x=x; e[tot].z=z; e[tot].next=head[u]; head[u]=tot++; } int main() { int a,b,c; memset(head,-1,sizeof(head)); memset(f,inf,sizeof(f)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); adde(a,b,c); adde(b,a,c); } f[1]=0; q.push(make_pair(f[1],1)); while(!q.empty()) { int u=q.top().second; q.pop(); if(vis[u]) continue; vis[u]=1; for(int k=head[u];k!=-1;k=e[k].next) { int t=e[k].x; if(f[u]+e[k].z<f[t]) { f[t]=f[u]+e[k].z; q.push(make_pair(f[t],t)); } } } printf("%d",f[n]); return 0; }