杭电ACM-LCY算法进阶培训班-专题训练(03-07-11-15)
1012 最短路
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
//#define ll long long
#define int long long
//#define double long double
#define re register int
#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define P pair < int , int >
#define mk make_pair
using namespace std;
const int mod=1e9+7;
const int M=1e8+5;
const int N=2e6+5;//?????????? 4e8
struct node{int ver,edge,next;}e[N];
int n,m,tot,head[N],d[N],v[N];
void add(int x,int y,int z){e[++tot].ver=y;e[tot].edge=z;e[tot].next=head[x];head[x]=tot;}
void addedge(int x,int y,int z){add(x,y,z);add(y,x,z);}
void init()
{
tot=1;
for(re i=0;i<=n+1;i++) head[i]=v[i]=0,d[i]=1e18;
d[1]=0;
}
void dijkstra()
{
priority_queue < pair < int , int > > q;
q.push(mk(0,1));
while(q.size())
{
int x=q.top().second;q.pop();
if(v[x]) continue;v[x]=1;
for(re i=head[x];i;i=e[i].next)
{
int y=e[i].ver;
int z=e[i].edge;
if(d[y]>d[x]+z) d[y]=d[x]+z,q.push(mk(-d[y],y));
}
}
}
void solve()
{
while(cin>>n>>m&&(n+m))
{
init();
for(re i=1;i<=m;i++)
{
int x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
addedge(x,y,z);
}
dijkstra();
cout<<d[n]<<endl;
}
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
// printf("Case #%d: ",index);
solve();
// puts("");
}
return 0;
}
/*
4
1 2 3 4
*/
1013 六度分离
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
//#define ll long long
#define int long long
//#define double long double
#define re register int
#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define P pair < int , int >
#define mk make_pair
using namespace std;
const int mod=1e9+7;
const int M=1e8+5;
const int N=2e6+5;//?????????? 4e8
int d[1005][1005],n,m;
void solve()
{
while(cin>>n>>m)
{
int op=0;
for(re i=1;i<=n;i++) for(re j=1;j<=n;j++) d[i][j]=1e18;
for(re i=1;i<=n;i++) d[i][i]=0;
for(re i=1;i<=m;i++)
{
int x,y;
scanf("%lld%lld",&x,&y);
x++,y++;
d[x][y]=d[y][x]=1;
}
for(re k=1;k<=n;k++) for(re i=1;i<=n;i++) for(re j=1;j<=n;j++) d[i][j]=d[j][i]=min(d[i][j],d[i][k]+d[k][j]);
for(re i=1;i<=n;i++) for(re j=1;j<=n;j++) if(d[i][j]>7) op=1;
if(op) puts("No");
else puts("Yes");
}
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
// printf("Case #%d: ",index);
solve();
// puts("");
}
return 0;
}
/*
4
1 2 3 4
*/
1014 Choose the best route
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
//#define ll long long
#define int long long
//#define double long double
#define re register int
#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define P pair < int , int >
#define mk make_pair
using namespace std;
const int mod=1e9+7;
const int M=1e8+5;
const int N=2e6+5;//?????????? 4e8
int n,m,d[N],tot,head[N],v[N];
struct ndoe{int ver,edge,next;}e[N];
void add(int x,int y,int z){e[++tot].ver=y;e[tot].edge=z;e[tot].next=head[x];head[x]=tot;}
void addedge(int x,int y,int z){add(x,y,z);add(y,x,z);}
void dijkstra(int s)
{
d[s]=0;
priority_queue < pair < int , int > > q;
q.push(mk(0,s));
while(q.size())
{
int x=q.top().second;q.pop();
if(v[x]) continue; v[x]=1;
for(re i=head[x];i;i=e[i].next)
{
int y=e[i].ver;
int z=e[i].edge;
if(d[y]>d[x]+z) d[y]=d[x]+z,q.push(mk(-d[y],y));
}
}
}
void init()
{
for(re i=0;i<=n+1;i++) head[i]=v[i]=0,d[i]=1e18;
tot=1;
}
void solve()
{
int t;
while(cin>>n>>m>>t)
{
init();
for(re i=1;i<=m;i++)
{
int x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
add(x,y,z);
}
cin>>m;
for(re i=1;i<=m;i++)
{
int x;
scanf("%lld",&x);
add(n+1,x,0);
}
dijkstra(n+1);
if(d[t]==1e18) puts("-1");
else printf("%lld\n",d[t]);
}
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
// printf("Case #%d: ",index);
solve();
// puts("");
}
return 0;
}
/*
4
1 2 3 4
*/
1015 Arbitrage
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
//#define int long long
//#define double long double
#define eps 1e-5
//#define mod 1e9+7
using namespace std;
const int mod=1e4+7;
const int N=1e4+5;//空间最大限制 19260817
struct node
{
int ver,next;
double edge;
}e[N];
int tot,head[N];
void add(int x,int y,double z)
{
e[++tot].ver=y;
e[tot].next=head[x];
e[tot].edge=z;
head[x]=tot;
}
int n,m;
map < string , int > mp;
map < int , string > p;
int v[N],cnt[N];
double d[N];
void init()
{
memset(e,0,sizeof(e));
tot=0;
memset(head,0,sizeof(head));
mp.clear();
}
bool spfa(int s)
{
memset(v,0,sizeof(v));
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++) d[i]=0;
queue < int > q;
q.push(s);
v[s]=1;
d[s]=1.0;
// cnt[s]=1;
while(q.size())
{
int x=q.front();
q.pop();
v[x]=0;
for(int i=head[x];i;i=e[i].next)
{
int y=e[i].ver;
double z=e[i].edge;
if(d[y]<z*d[x])
{
d[y]=z*d[x];
cnt[y]=cnt[x]+1;
if(cnt[y]>n) return true;
if(!v[y])
{
v[y]=1;
q.push(y);
}
}
}
}
return false;
}
signed main()
{
// ios::sync_with_stdio(false);
int flag=0;
while(scanf("%d",&n)&&n)
{
init();
flag++;
int fla=0;
// p.clear();
for(int i=1;i<=n;i++)
{
string s;
cin>>s;
mp[s]=i;
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
string s1,s2;
double z;
cin>>s1>>z;
cin>>s2;
add(mp[s1],mp[s2],z);
// add(mp[s2],mp[s1],z);
}
for(int i=1;i<=n;i++)
if(spfa(i))
{
printf("Case %d: Yes\n",flag);
fla=1;
break;
}
if(!fla) printf("Case %d: No\n",flag);
}
return 0;
}