// vector版 类邻接表 HDU - 2544 # include #include #include #include using namespace std; #define inf 0x3f3f3f3f #define maxx 100+10 #define maxxx 40000 struct pp { int v,val; }ss; vectorq[10005]; int n,m,p; void dijk(int qi,int end) {
int dis[maxxx]; memset(dis,inf,sizeof(dis)); queue<int>qq; dis[qi]=0; qq.push(qi); while(!qq.empty()) { int t=qq.front(); qq.pop(); for(int i=0;i<q[t].size();i++) { pp tt=q[t][i]; int val=tt.val; int v=tt.v; if(dis[v]>dis[t]+val) {dis[v]=dis[t]+val; qq.push(v); } } } cout<<dis[end]<<endl;} int main() {
while(cin>>n>>m) { if(n==0&&m==0) break; p=0; for(int i=0;i<=n;i++) q[i].clear(); //清空vector for(int i=0;i<m;i++) { int u,v,val; cin >>u>>v>>val; ss.val=val; ss.v=v; q[u].push_back(ss); ss.v=u; q[v].push_back(ss); //本题是无向图,所以正反存 } dijk(1,n); //1--->n }return 0; }
//vectot 加 priority_queue #include #include #include #include using namespace std; #define inf 0x3f3f3f3f #define maxx 100+10 #define maxxx 40000 struct pp { int v,val; }ss; struct node { int v,dis; node(int xx,int yy):v(xx),dis(yy){} bool friend operator<(const node a,const node b) { return a.dis>b.dis; } } ; vectorq[10005]; int n,m,p; void dijk(int qi,int end) {
int dis[maxxx],vis[maxxx]; memset(vis,0,sizeof(vis)); memset(dis,inf,sizeof(dis)); priority_queue<node>qq; dis[qi]=0; qq.push(node(qi,dis[qi])); while(!qq.empty()) { node t=qq.top(); qq.pop(); if(vis[t.v]) continue; vis[t.v]=1; for(int i=0;i<q[t.v].size();i++) { pp tt=q[t.v][i]; int val=tt.val; int v=tt.v; if(!vis[v]&&dis[v]>dis[t.v]+val) { dis[v]=dis[t.v]+val; qq.push(node(v,dis[v])); } } } cout<<dis[end]<<endl;} int main() {
while(cin>>n>>m) { if(n==0&&m==0) break; p=0; for(int i=0;i<=n;i++) q[i].clear(); //清空vector for(int i=0;i<m;i++) { int u,v,val; cin >>u>>v>>val; ss.val=val; ss.v=v; q[u].push_back(ss); ss.v=u; q[v].push_back(ss); //本题是无向图,所以正反存 } dijk(1,n); //1--->n }return 0; }
“`
效率最高的堆优化还是不会。。。,自己还是太菜!!!!