标签:
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