p1217晚餐(简单的dijkstra)
题目:
输入:
1000 5 6
1 2 300
2 4 200
3 4 600
3 4 800
5 3 100
2 5 650
输出:
4
这道题呢,其实就是用邻接矩阵将每条边耗费的体力存起来,然后用dijkstra算法求出每个牧场到Bessie所在的第一个牧场所耗费的最少时间,然后统计一下在
t范围内的有几头奶牛即可。
代码如下:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int a[1100][1100]; bool b[1100][1100]; int dis[110000]; bool vis[10000]; int main() { int t,f,p; cin>>t>>f>>p; memset(a,10,sizeof(a)); memset(b,false,sizeof(b)); for(int i=1;i<=p;i++) { int xx,yy,zz; cin>>xx>>yy>>zz; if(b[xx][yy]==true||b[yy][xx]==true) { if(zz<a[xx][yy]) a[xx][yy]=zz; } if(b[xx][yy]==false) { a[xx][yy]=zz; a[yy][xx]=zz; b[xx][yy]=true; } } int sum=0; int maxx=-2; //for(int k=1;k<=f;k++) { for(int i=1;i<=f;i++) dis[i]=a[1][i]; memset(vis,0,sizeof(vis)); vis[1]=1; dis[1]=0; for(int i=1;i<f;i++) { int minn=9999999; int x=0; for(int j=1;j<=f;j++) { if(!vis[j]&&(dis[j]<minn)) { minn=dis[j]; x=j; } } if(x==0) break; vis[x]=1; for(int j=1;j<=f;j++) { if(!vis[j]&&(dis[x]+a[x][j]<dis[j])) { dis[j]=dis[x]+a[x][j]; } } } sum=0; for(int i=1;i<=f;i++) { if(dis[i]<=t) sum++; } if(sum>maxx) { maxx=sum; } } cout<<maxx<<endl; return 0; }
输入时,因为我发现每两个牧场间会有重复的路,所以用bool型数组记录一下这两个草地见是否已经有路了,如果有的话直接
从这两个重复的路中选出耗费体力最少的留下。