2025.6.30作业
ren_gao_zu · · 学习·文化课
P5764 [CQOI2005] 新年好
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[10];
const int N=1e5+5;
struct node{
int v,w;
bool operator < (const node &b) const
{
return b.w<w;
}
};
bool vis[10005];
int dis[100005];
priority_queue<node>q;
vector<node>e[100005];
void dij(int s){
for(int i=1;i<=n;i++){
dis[i]=1e18;
vis[i]=0;
}
dis[s]=0;
q.push({s,0});
while(q.size()){
node tt=q.top();
q.pop();
int u=tt.v;
if(vis[u]==1)continue;
vis[u]=1;
for(int i=0;i<e[u].size();i++){
int v=e[u][i].v,w=e[u][i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v])q.push({v,dis[v]});
}
}
}
return;
}
int b[10],ma=1e18;
bool vsi[10];
void dfs(int u){
if(u>5){
int sum=0;
int x=b[1],y=b[2],z=b[3],r=b[4],s=b[5];
dij(1);
sum+=dis[x];
dij(x);
sum+=dis[y];
dij(y);
sum+=dis[z];
dij(z);
sum+=dis[r];
dij(r);
sum+=dis[s];
ma=min(sum,ma);
return;
}
for(int i=1;i<=5;i++){
if(vsi[i]==0){
vsi[i]=1;
b[i]=a[i];
dfs(u+1);
vsi[i]=0;
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=5;i++)cin>>a[i];
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
e[x].push_back({y,z});
e[y].push_back({x,z});
}
dfs(1);
cout<<ma;
return 0;
}
P1948 [USACO08JAN] Telephone Lines S
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,p,k;
struct node{
int v,w;
bool operator < (const node &b) const
{
return b.w<w;
}
};
vector<node>e[100005];
priority_queue<node>q;
int dis[100005],a[100005],b[100005],c[100005];
bool vis[100005];
void erfen();
bool check(int mid);
void dijkstra(int s);
int da=-1;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>p>>k;
for(int i=1;i<=p;i++){
cin>>a[i]>>b[i]>>c[i];
}
erfen();
cout<<da;
return 0;
}
void erfen(){
int mid,l=0,r=1e18;
while(l<=r){
mid=(l+r)/2;
if(check(mid)){
da=mid;
r=mid-1;
}
else l=mid+1;
}
}
bool check(int mid){
for(int i=1;i<=n;i++)e[i].clear();
for(int i=1;i<=p;i++){
int x=a[i],y=b[i],z=c[i]-mid;
if(z<=0)z=0;
else z=1;
e[x].push_back({y,z});
e[y].push_back({x,z});
}
dijkstra(1);
if(dis[n]<=k){
return 1;
}
else return 0;
}
void dijkstra(int s){
for(int i=1;i<=n;i++)dis[i]=1e18,vis[i]=0;
dis[s]=0;
q.push({s,0});
while(q.size()){
node tt=q.top();
q.pop();
int u=tt.v;
if(vis[u]==1)continue;
vis[u]=1;
for(int i=0;i<e[u].size();i++){
int v=e[u][i].v,w=e[u][i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v])q.push({v,dis[v]});
}
}
}
}