HDU Today
HDU - 2112
经典最短路
先将字符串对应到数。
对于map中没有的字符串其值为0
因为没有考虑到起点和顶点相同的情况(准确说是考虑过,但是想错了,,,emmm)wa死我了。。。。
经典dijkstra。
#include<iostream>
#include<string>
#include<map>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int INF=100000001;
map<string,int> dis;
int cost[160][160];
int d[160];
bool use[160];
void hdu2112(){
int n;
while(cin>>n&&n!=-1){
//inital
dis.clear();
for(int i=0;i<160;i++){
use[i]=false;
d[i]=INF;
}
for(int i=0;i<160;i++)
for(int j=0;j<160;j++)
if(i!=j) cost[i][j]=INF;
else cost[i][j]=0;
int index=1;
string start,end;
cin>>start>>end;
dis[start]=index++;
dis[end]=index++;
for(int i=1;i<=n;i++){
string s,t;
cin>>s>>t;
if(dis[s]==0)
dis[s]=index++;
if(dis[t]==0)
dis[t]=index++;
int cost_t; cin>>cost_t;
if(cost_t<cost[dis[s]][dis[t]])
cost[dis[t]][dis[s]]=cost[dis[s]][dis[t]]=cost_t;
}
//initial the distance
if(start==end){ //wawawawawawawawa
cout<<"0"<<endl;
continue;
}
d[1]=0;
use[1]=true;
for(int i=1;i<index;i++){
d[i]=cost[1][i];
}
//dijkstra
while(true){
int v=-1;
//find the shortest
for(int i=1;i<index;i++){
if(!use[i]&&((v==-1)|| d[i]<d[v])) v=i;
}
if(v==-1) break;
use[v]=true;
//update
for(int i=1;i<index;i++){
d[i]=min(d[i],d[v]+cost[v][i]);
}
}
if(d[dis[end]]<INF)
cout<<d[dis[end]]<<endl;
else
cout<<"-1"<<endl;
}
}
int main(){
hdu2112();
system("pause");
}
用优先队列优化一下dijkstra
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
const int INF=100000001;
map<string,int> dis;
int cost[160][160];
int d[160];
bool use[160];
void hdu2112x(){
int n;
while(cin>>n&&n!=-1){
//inital
dis.clear();
for(int i=0;i<160;i++){
use[i]=false;
d[i]=INF;
}
for(int i=0;i<160;i++)
for(int j=0;j<160;j++)
if(i!=j) cost[i][j]=INF;
else cost[i][j]=0;
int index=1;
string start,end;
cin>>start>>end;
dis[start]=index++;
dis[end]=index++;
for(int i=1;i<=n;i++){
string s,t;
cin>>s>>t;
if(dis[s]==0)
dis[s]=index++;
if(dis[t]==0)
dis[t]=index++;
int cost_t; cin>>cost_t;
if(cost_t<cost[dis[s]][dis[t]])
cost[dis[t]][dis[s]]=cost[dis[s]][dis[t]]=cost_t;
}
//initial the distance
if(start==end){
cout<<"0"<<endl;
continue;
}
priority_queue<P,vector<P>,greater<P> > que;
for(int i=1;i<index;i++){
d[i]=cost[1][i];
if(d[i]!=INF){
que.push(pair<int,int>(d[i],i));
}
}
//queue + dijkstra
while(!que.empty()){
pair<int,int> cur=que.top();
que.pop();
if(d[cur.second]<cur.first) continue; //the cur is out of data
for(int i=1;i<index;i++){
if(d[i]>d[cur.second]+cost[cur.second][i]){
d[i]=d[cur.second]+cost[cur.second][i];
que.push(pair<int,int>(d[i],i));
}
}
}
if(d[dis[end]]<INF)
cout<<d[dis[end]]<<endl;
else
cout<<"-1"<<endl;
}
}
int main(){
hdu2112x();
system("pause");
}