1 条题解
-
0
C++ :
#include<iostream> #include<cstring> using namespace std; const int N=1010; int map[N][N],dist[N],num[N]; int n,e; bool dijkstra(int s) { int i,j,minpath,minpoint,pos; int used[N]; memset(used,0,sizeof(used)); for(i=1;i<=n;i++) { num[i]=s; dist[i]=map[s][i]; } used[s]=1; num[s]=-1; pos=s; for(i=1;i<n;i++) { minpoint=0; minpath=0; for(j=1;j<=n;j++) if(used[j]==0&&dist[j]!=0&&(minpath==0||minpath>=dist[j])) { minpoint=j; minpath=dist[j]; pos=j; } if(minpoint==0) return false; if(minpoint==e) return true; used[minpoint]=1; for(j=1;j<=n;j++) if(used[j]==0&&map[minpoint][j]!=0&&(dist[j]==0||dist[j]>=dist[minpoint]+map[minpoint][j])) { dist[j]=dist[minpoint]+map[minpoint][j]; num[j]=pos; } } return true; } void dsf(int i) { if(i!=-1) { dsf(num[i]); cout<<i<<" "; } } int main() { int m,s,i,x,y,len; while(cin>>n>>m>>s>>e) { memset(num,0,sizeof(num)); memset(map,0,sizeof(map)); for(i=1;i<=m;i++) { cin>>x>>y>>len; if(map[x][y]==0||map[x][y]>len) { map[x][y]=len; map[y][x]=len; } } if(dijkstra(s)) { cout<<dist[e]<<endl; i=s; dsf(e); cout<<endl; } else { cout<<"can't arrive"<<endl; } } return 0; }
Java :
import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; import java.util.*; public class Main { static PrintStream ps = new PrintStream(System.out); static Scanner sc = new Scanner(System.in); class Pair implements Comparable<Pair>{ int x, val; public Pair(int x, int val) { super(); this.x = x; this.val = val; } public int compareTo(Pair a) { // TODO Auto-generated method stub return val - a.val; } } void dja(int s, int t, int[] d, int path[], Vector<Pair> ed[]) { PriorityQueue<Pair> pq = new PriorityQueue<Pair>(); pq.add(new Pair(t, 0)); while(!pq.isEmpty()) { Pair a1 = pq.poll(); int cur = a1.x, dis = a1.val; if(dis != d[cur]) continue; for (int i = 0; i < ed[cur].size(); i++) { int next = ed[cur].get(i).x, len = ed[cur].get(i).val; if(dis + len < d[next]) { d[next] = dis + len; path[next] = cur; pq.add(new Pair(next, d[next])); } else if(dis + len == d[next] && cur < path[next]) path[next] = cur; } } } void run() { int m, n, s, t, path[] = new int[1024], d[] = new int[1024]; Vector<Pair> ed[] = new Vector[1024]; while(sc.hasNext()) { n = sc.nextInt(); m = sc.nextInt(); s = sc.nextInt(); t = sc.nextInt(); for (int i = 0; i <= n; i++) { path[i] = -1; d[i] = Integer.MAX_VALUE; ed[i] = new Vector<Pair>(); } d[t] = 0; for (int i = 0; i < m; i++) { int a = sc.nextInt(), b = sc.nextInt(), val = sc.nextInt(); ed[b].add(new Pair(a, val)); ed[a].add(new Pair(b, val)); } dja(s, t, d, path, ed); ps.println(d[s]); ps.print(s); for (int i = s; i!=t; i=path[i]) { ps.print(" " + path[i]); } ps.println(); // ps.println(Arrays.toString(path)); // ps.println(Arrays.toString(d)); } } public static void main(String args[]) throws FileNotFoundException { //sc = new Scanner(new File("e:\\test.txt")); new Main().run(); } }
- 1
信息
- ID
- 1149
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者