A.Birthday Cake
待填坑
B
思路简单,先跑一遍最短路,然后加边意味着这两个点的边耗费为0,在跑一次最短路,然后删边,再用下一个跑最短路。最小的即为最优解。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#define inf 1e10
#define mm(i,v) memset(i,v,sizeof i);
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=150010;
struct node{//存边
int v;
ll w;
node(int v=0,ll w=0):v(v),w(w){}
};
struct qnode{//用于优先队列存最短路
int v;
ll c;
qnode(int v=0,ll c=0):v(v),c(c){}
bool operator < (const qnode &g) const{
return c>g.c;
}
};
vector<node> e[maxn];
bool vis[maxn];
ll dis[maxn];
void dijkstra(int n,int start){
mm(vis,0);
for(int i=0;i<n;i++)
dis[i]=inf;
priority_queue<qnode> q;
while(!q.empty())
q.pop();
dis[start]=0;
q.push(qnode(start,0));
qnode temp;
while(!q.empty()){
temp=q.top();q.pop();
int u=temp.v;
if(vis[u])
continue;
vis[u]=true;
for(int i=0;i<e[u].size();i++){
int v=e[u][i].v;
ll w=e[u][i].w;
if(!vis[v]&&dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
q.push(qnode(v,dis[v]));
}
}
}
}
void addedge(int u,int v,int w){
e[u].push_back(node(v,w));
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n,m,f,s,t;
cin>>n>>m>>f>>s>>t;
int u,v,w;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
addedge(u,v,w);
addedge(v,u,w);
}
ll minn=inf;
dijkstra(n,s);
minn=min(minn,dis[t]);
for(int i=1;i<=f;i++){
cin>>u>>v;
addedge(u,v,0);
dijkstra(n,s);
minn=min(minn,dis[t]);
e[u].erase(e[u].end()-1);
}
cout<<minn<<"\n";
return 0;
}
F.GlitchBot
直接暴力
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#define mm(i,v) memset(i,v,sizeof i);
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int step[200];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int xx,yy,n;
bool check(){
int d=0;
int x=0,y=0;
for(int i=0;i<n;i++){
if(step[i]==0){
x+=dx[d];
y+=dy[d];
}
else if(step[i]==1)
d=(d+3)%4;
else
d=(d+1)%4;
}
return (x==xx&&y==yy);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
bool f=true;
cin>>xx>>yy>>n;
char s[20];
for(int i=0;i<n;i++){
cin>>s;
if(s[0]=='F')
step[i]=0;
else if(s[0]=='L')
step[i]=1;
else
step[i]=2;
}
for(int i=0;i<n&&f;i++){
for(int j=1;j<=3;j++){
step[i]=(step[i]+1)%3;
if(check()){
cout<<i+1<<" ";
if(step[i]==0)
cout<<"Forward\n";
else if(step[i]==1)
cout<<"Left\n";
else
cout<<"Right\n";
f=false;
break;
}
}
}
return 0;
}