题目请戳这里
题目大意:给n个点,每个点与其他点有一些有向边,边权为边长。每个点有一个属性,1表示靠海,otherwise 0。现在从0出发,要到靠近海边的点,求最短距离。
题目分析:最短路。可是10个点的有向图也懒得写最短路了。直接爆搜吧。
比赛的时候准备直接dfs的。男神不知道找了个什么理由非要我写bfs+优先队列优化。。。。。。。
事实证明,这题太水。。。
详情请见代码:
dfs:
#include <iostream> #include<cstdio> #include<cstring>
#include<queue> using namespace std; const int N = 15; const int inf = 0x3f3f3f3f; int n,m; int a[N]; int g[N][N]; int ans; void dfs(int cur,int sum,int dp) { if(dp > n) return; if(a[cur]) { if(ans > sum) ans = sum; return; } if(sum > ans) return; int i; for(i = 0;i < n;i ++) { if(g[cur][i] < inf) dfs(i,sum + g[cur][i],dp + 1); } } int main() { int i,j,x; while(scanf("%d",&n) != EOF) { memset(g,0x3f,sizeof(g)); for(i = 0;i < n;i ++) { scanf("%d%d",&m,&a[i]); while(m --) { scanf("%d%d",&j,&x); g[i][j] = min(g[i][j],x); } } ans = inf; dfs(0,0,1); printf("%d\n",ans); } return 0; }
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int N = 15; const int inf = 0x3f3f3f3f; struct node { int id; ll dis; }s,now; bool operator <(const node &a,const node &b) { return a.dis >b.dis; } int a[N]; priority_queue<node>lcm; int n; ll g[N][N]; ll Bfs() { int i; s.id = 0; s.dis = 0; while(!lcm.empty()) lcm.pop(); lcm.push(s); while(!lcm.empty()) { now = lcm.top(); lcm.pop(); if(a[now.id]) return now.dis; for(i = 0;i < n;i ++) { if(g[now.id][i] < inf) { s.id = i; s.dis = now.dis + g[now.id][i]; lcm.push(s); } } } return -1; } int main() { int i,j,m; while(scanf("%d",&n) != EOF) { for(i = 0;i <= n;i ++) for(j = 0;j <= n;j ++) g[i][j] = inf; for(i = 0;i < n;i ++) { scanf("%d%d",&m,&a[i]); while(m --) { int ta; ll td; scanf("%d%I64d",&ta,&td); g[i][ta] = min(g[i][ta],td); } } printf("%I64d\n",Bfs()); } return 0; }