没看好题目条件 随便写了个弗洛伊德就交了 实际上两个身份差距大的人是连间接交易都不允许的 所以枚举每个等级区间并对其用dijkstra算法找最小值
AC代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <bitset>
#include <vector>
#include <string>
#include <deque>
#include <set>
#include <map>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long ll;
const int maxn=222;
const int inf=0x3f3f3f3f;
int cost[maxn][maxn];
int pre[maxn];
int level[maxn];
int lowcost[maxn];
bool vis[maxn];
void display(int n)
{
for(int i=1;i<=2*n;i++)
{
cout<<lowcost[i]<<' ';
}
cout<<endl;
}
void dijkstra(int n,int beg,int high,int low)
{
for(int i=1;i<=2*n;i++)
{
lowcost[i]=inf;vis[i]=false;pre[i]=-1;
}
lowcost[beg]=0;
for(int j=1;j<=2*n;j++)
{
int k=-1;
int Min=inf;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&lowcost[i]<Min)
{
Min=lowcost[i];
k=i;
}
}
if(k==-1) break;
vis[k]=true;
for(int i=1;i<=2*n;i++)
{
if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]&&((level[i]<=high&&level[i]>=low&&level[k]<=high&&level[k]>=low)||i>n))
{
lowcost[i]=lowcost[k]+cost[k][i];
pre[i]=k;
}
//display(n);
}
}
//display(n);
}
int main()
{
memset(cost,inf,sizeof(cost));
int m,n;
cin>>m>>n;
int point=n+1;
for(int i=1;i<=n;i++)
{
int p,l,x;
scanf("%d%d%d",&p,&l,&x);
cost[i][point++]=p;
level[i]=l;
while(x--)
{
int t,v;
scanf("%d%d",&t,&v);
cost[i][t]=v;
}
}
int ans=inf;
for(int high=level[1]+m,low=level[1];high>=level[1];high--,low--)
{
dijkstra(n,1,high,low);
for(int i=n+1;i<=2*n;i++)
{
ans=min(ans,lowcost[i]);
//cout<<lowcost[i]<<' ';
}
//cout<<endl;
//display(n);
}
printf("%d\n",ans);
}
图论还是要认真搞搞。。。