HDU1546-Idiomatic Phrases Game(SPFA)
阿新 • • 發佈:2019-01-30
莫名WA幾發,瞭解了一下前向星,其實和vector差不多。也有一定用處。
#include<stdio.h> #include<queue> #include<string.h> #include<iostream> #define INF 1000000000 using namespace std; int n; char str[1005][1005]; int dis[1100],val[1050]; vector<int>edg[1005]; void spfa(int s) { queue<int> q; int visit[1005]; memset(visit,0,sizeof(visit)); dis[s]=0; q.push(s); while(!q.empty()) { int k=q.front(); q.pop(); visit[k]=0; for(int i=0;i<edg[k].size();i++) { int w=val[k]; int date=edg[k][i]; if(dis[k]+w<dis[date]) { dis[date]=dis[k]+w; if(!visit[date]) { visit[date]=1; q.push(date); } } } } } void clear() { for(int i=0;i<=n;i++) dis[i]=INF; for(int i=0;i<n;i++) { edg[i].clear(); } } int main() { while(scanf("%d",&n)!=EOF&&n) { clear(); for(int i=0;i<n;i++) scanf("%d%s",&val[i],&str[i]); for(int i=0;i<n;i++) { int len2=strlen(str[i]); for(int j=0;j<n;j++) { if(str[i][len2-4]==str[j][0]&&str[i][len2-3]==str[j][1]&&str[i][len2-2]==str[j][2]&&str[i][len2-1]==str[j][3]) { edg[i].push_back(j); } } } spfa(0); if(dis[n-1]==INF) printf("-1\n"); else printf("%d\n",dis[n-1]); } }