标签:
Description
Input
Output
Sample Input
1 4 10000 3 2 2 8000 3 5000 1000 2 1 4 200 3000 2 1 4 200 50 2 0
Sample Output
5250
思路:注意range,裸最短路;
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const int N=1002;
int pri[N][N],vis_[N];
int gra[N][N],vis[N][N];
int dist[N];
void dijkstra(int n,int s,int dex)
{
for(int i=1;i<=n;i++){
dist[i]=INF;
vis_[i]=0;
}
dist[s]=pri[dex][s];
//cout<<"^^"<<endl;
for(int i=1;i<=n;i++){
int minn=INF,pos=-1;
for(int j=1;j<=n;j++)
{
if(pri[dex][j]!=-1&&vis_[j]==0&&dist[j]<minn)
{
minn=dist[j];
pos=j;
}
}
if(pos==-1) break;
vis_[pos]=1;
//cout<<"**"<<pos<<endl;
for(int j=1;j<=n;j++)
{
if(!vis_[j]&&pri[dex][j]!=-1&&vis[pos][j]&&dist[j]>dist[pos]+gra[pos][j])
dist[j]=dist[pos]+gra[pos][j];
}
}
//for(int i=1;i<=n;i++)
// printf("%d__[%d]_",dist[i],i);
}
int main()
{
int m,n;
while(scanf("%d%d",&m,&n)==2)
{
mem(pri,-1);
mem(vis,0);
int ans,L;
int mo,le,re;
scanf("%d%d%d",&mo,&le,&re);
ans=mo,L=le;
for(int i=0;i<=m;i++)
pri[i][1]=mo;
for(int i=0;i<re;i++)
{
int a,b;
scanf("%d%d",&a,&b);
vis[a][1]=1;
gra[a][1]=b;
}
for(int i=2;i<=n;i++)
{
scanf("%d%d%d",&mo,&le,&re);
for(int j=0;j<=m;j++)
{
if(le>=L-m+j&&le<=L+j)
pri[j][i]=mo;
}
for(int j=0;j<re;j++)
{
int a,b;
scanf("%d%d",&a,&b);
vis[a][i]=1;
gra[a][i]=b;
}
}
for(int i=2;i<=n;i++)
{
for(int j=0;j<=m;j++)
if(pri[j][i]!=-1)
{
dijkstra(n,i,j);
if(dist[1]<ans)
ans=dist[1];
}
}
printf("%d\n",ans);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/code_or_code/article/details/43792307