首页 > 代码库 > ZOJ2750Idiomatic Phrases Game 建图Dijkstra
ZOJ2750Idiomatic Phrases Game 建图Dijkstra
Dijkstra部分不难,主要是建图
#include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<iostream> using namespace std; #define INF 10000000 #define maxn 1005 struct bian { string a; string b; int time; }tu[maxn]; int n,s[maxn],dist[maxn]; int edge[maxn][maxn]; void Dijkstra(int v0) { int i,j; for(i=0;i<n;i++) { s[i]=0;dist[i]=edge[v0][i]; } s[v0]=1;dist[v0]=0; for(i=0;i<n-1;i++) { int min=INF,u=v0; for(j=0;j<n;j++) { if(!s[j]&&dist[j]<min) { u=j; min=dist[j]; } } s[u]=1; for(j=0;j<n;j++) { if(!s[j]&&dist[j]>dist[u]+edge[u][j]) dist[j]=dist[u]+edge[u][j]; } } } int main() { int i,j,k,t; string str; while(cin>>n) { if(n==0) break; for(k=0;k<n;k++)//预处理 { cin>>t>>str; tu[k].time=t; tu[k].a=""; tu[k].b=""; for(j=0;j<4;j++) { tu[k].a+=str[j]; } for(j=str.length()-4;j<str.length();j++) { tu[k].b+=str[j]; } }//建图 for(i=0;i<n;i++) { for(j=0;j<n;j++) { edge[i][j]=INF; if(i==j) continue; if(tu[i].b==tu[j].a) edge[i][j]=tu[i].time; } } Dijkstra(0); if(dist[n-1]<INF) cout<<dist[n-1]<<endl; else cout<<-1<<endl; } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。