[kuangbin带你飞]专题四 最短路练习 M POJ 1062
2016-10-12 23:11
393 查看
题目地址:https://vjudge.net/contest/66569#problem/M
思路:恩……这么小的数据,先爆为敬。哪天有空再补一个最短路的写法吧……感觉不是很难的样子。
补:最短路的方法,等级的范围显然为酋长等级-m到酋长等级+m,枚举所有可能,求spfa即可。这里用一个0点作为起点,与所有点相连 ,避免了重复n次的spfa操作
AC代码:
最短路:
思路:恩……这么小的数据,先爆为敬。哪天有空再补一个最短路的写法吧……感觉不是很难的样子。
补:最短路的方法,等级的范围显然为酋长等级-m到酋长等级+m,枚举所有可能,求spfa即可。这里用一个0点作为起点,与所有点相连 ,避免了重复n次的spfa操作
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; struct{ int v,l; }T[105]; vector<pair<int,int> >E[105]; int m,n; bool vis[105]; void init() { for(int i=0;i<105;i++) { E[i].clear(); vis[i]=false; } } int dfs(int t,int high,int low) { int minn=T[t].v; for(int i=0;i<E[t].size();i++) { int v=E[t][i].first; if(T[v].l>high+m || T[v].l<low-m || vis[v]) continue; int temp1=min(high,T[v].l); int temp2=max(low,T[v].l); vis[v]=true; int temp=E[t][i].second+dfs(v,temp1,temp2); vis[v]=false; if(temp<minn) minn=temp; } return minn; } int main() { while(~scanf("%d%d",&m,&n)){ init(); for(int i=1;i<=n;i++) { int x; scanf("%d%d%d",&T[i].v,&T[i].l,&x); for(int j=1;j<=x;j++) { int a,b; scanf("%d%d",&a,&b); E[i].push_back(make_pair(a,b)); } } int high,low; high=low=T[1].l; int ans=T[1].v; printf("%d\n",dfs(1,high,low)); } }
最短路:
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> using namespace std; struct{ int v,l; }T[105]; vector<pair<int,int> >E[105]; int m,n; int vis[105]; int in[105]; int d[105]; void init() { for(int i=0;i<105;i++) { E[i].clear(); } } void spfa(int low,int high) { memset(vis,0,sizeof(vis)); memset(in,0,sizeof(in)); for(int i=0;i<105;i++) d[i]=0x3f3f3f3f; queue<int>q; q.push(0); vis[0]=1; d[0]=0; while(!q.empty()) { int now=q.front(); q.pop(); vis[now]=0; in[now]++; for(int i=0;i<E[now].size();i++) { int v=E[now][i].first; if(T[v].l>high || T[v].l<low) continue; if(d[v]>d[now]+E[now][i].second) { d[v]=d[now]+E[now][i].second; if(vis[v] || in[now]>n) continue; q.push(v); vis[v]=1; } } } } int main() { while(~scanf("%d%d",&m,&n)){ init(); for(int i=1;i<=n;i++) { int x; scanf("%d%d%d",&T[i].v,&T[i].l,&x); E[0].push_back(make_pair(i,T[i].v)); for(int j=1;j<=x;j++) { int a,b; scanf("%d%d",&a,&b); E[a].push_back(make_pair(i,b)); } } int minn=0x3f3f3f3f; for(int i=T[1].l-m;i<=T[1].l;i++) { spfa(i,i+m); if(d[1]<minn) minn=d[1]; } printf("%d\n",minn); } }
相关文章推荐
- [kuangbin带你飞]专题四 最短路练习 G POJ 1502
- [kuangbin带你飞]专题四 最短路练习 H POJ 3660
- [kuangbin带你飞]专题四 最短路练习 A POJ 2387
- [kuangbin带你飞]专题四 最短路练习 B POJ 2253
- [kuangbin带你飞]专题四 最短路练习 C POJ 1797
- [kuangbin带你飞]专题四 最短路练习 N POJ 1847
- [kuangbin带你飞]专题四 最短路练习
- [kuangbin带你飞]专题四 最短路练习
- [kuangbin带你飞]专题四 最短路练习
- [kuangbin带你飞]专题四 最短路练习 O LightOJ 1074
- [kuangbin带你飞]专题四 最短路练习H,I,J
- poj 1062(Kuangbin最短路专题M题)
- [kuangbin带你飞]专题四 最短路练习-E
- 【算法系列学习】SPFA邻接表最短路 [kuangbin带你飞]专题四 最短路练习 F - Wormholes
- [kuangbin带你飞]专题四 最短路练习 C
- POJ 2253 Frogger(kuangbin带你飞 专题四:最短路)
- [kuangbin带你飞]专题四 最短路练习 R
- [kuangbin带你飞]专题四 最短路练习 I POJ 2240
- [kuangbin带你飞]专题四 最短路练习 B
- 【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home