您的位置:首页 > 其它

[kuangbin带你飞]专题四 最短路练习 M POJ 1062

2016-10-12 23:11 393 查看
题目地址:https://vjudge.net/contest/66569#problem/M

思路:恩……这么小的数据,先爆为敬。哪天有空再补一个最短路的写法吧……感觉不是很难的样子。

补:最短路的方法,等级的范围显然为酋长等级-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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: