最短路-Prim算法 dijkstra算法
HDU-1233
#include <iostream> #define INF 1000000 using namespace std; int Map[105][105]; bool NewNode[105]; bool OldNode[105]; bool UsedNode[105]; int lowcast[105]; int main(int argc, const char * argv[]) { int n; cin.sync_with_stdio(false); while(cin>>n) { if(n==0) break; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) Map[i][j]=Map[j][i]=INF; for(int i=1;i<=n;i++) { NewNode[i]=false; OldNode[i]=true; lowcast[i]=INF; } for(int i=1;i<=n*(n-1)/2;i++) { int a,b,val; cin>>a>>b>>val; Map[a][b]=Map[b][a]=val; } int counter=1,pos=1,sum=0; while(counter!=n) { NewNode[pos]=true; OldNode[pos]=false; for(int i=1;i<=n;i++) { if(OldNode[i]==true&&Map[pos][i]<lowcast[i]) lowcast[i]=Map[pos][i]; } int Min=INF,Minpos; for(int i=1;i<=n;i++) { if(OldNode[i]==true&&lowcast[i]<Min) { Minpos=i; Min=lowcast[i]; } } pos=Minpos; counter++; sum+=Min; } cout<<sum<<endl; } return 0; }
dijkstra算法模板:
#include <iostream> #include <vector> #include <queue> #define INF 20000000 #define N 1005 #define LL long long int using namespace std; int n,m,s,pos; //点,边,起点,终点 LL ans;//总费用 struct Node//记录指向点和路径费用 { int pos,c; friend bool operator <(Node a,Node b) { return a.c>b.c; } }; vector<Node> g[N];//临接表 int dis[N];//距离数组 void ini()//初始化 { for(int i=1;i<=n;i++) g[i].clear(); ans=INF; } void dij(int from)//输入起点 { priority_queue<Node> q; fill(dis,dis+n+1,INF); dis[from]=0; Node now={from,0}; q.push(now); while(!q.empty()) { now=q.top(),q.pop(); int v=now.pos; if(dis[v]<now.c) continue; for(int i=0;i<g[v].size();i++) { Node e; e=g[v][i]; if(dis[e.pos]>dis[v]+e.c) { dis[e.pos]=dis[v]+e.c; Node next={e.pos,dis[e.pos]}; q.push(next); } } } }