列表

详情


NC210770. 无限电阻

描述

题目背景
题面
有一个一个无限大的电阻网(电阻网不漏电,并且不外连任何节点),你并不知道这里面有多少条导线和多少个节点,但现在已知其中存在编号为 1 ~ n 的 n 个点,以及 m 条连接这 n 个点的电阻为 的导线
现在我们通过理想电压表检测测得了以 1 和 n 为端点接入一个恒压电路时这 m 条导线上每一根导线两端的电压值(可能为负),且此时主干路电流大小为  
你需要求出以 1 和 n 为端点的当前电阻网的等效阻值,如果该电阻网不可能存在或者无法求得该电阻网的等效电阻则输出 "No Answer"

再次强调,这里的 n 个点和 m 条边只是无限电阻网中的一部分

输入描述

第一行三个数 n,m,I ()

接下来 m 行每行三个数 u_i,v_i,w_i 表示一条电阻导线的状态,其中 w_i 表示电压大小()

输出描述

一个数表示答案(若答案存在则将答案保留 6 位小数)

示例1

输入:

5 4 10
1 2 5
1 3 10
3 5 1
2 4 3

输出:

1.100000

说明:

第一组样例解释如图(未知的边与点在此省略)

示例2

输入:

3 2 10
1 2 -3
2 3 4

输出:

No Answer

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 40ms, 内存消耗: 4472K, 提交时间: 2020-10-16 22:03:08

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define maxn 100005
#define ll long long 
using namespace std;

int n,m,s,i,j,k;
int em,e[maxn*2],nx[maxn*2],ls[maxn],ec[maxn*2];
int d[maxn],t,w,vis[maxn];
ll dis[maxn];

void insert(int x,int y,int z){
	em++; e[em]=y; nx[em]=ls[x]; ls[x]=em; ec[em]=z;
	em++; e[em]=x; nx[em]=ls[y]; ls[y]=em; ec[em]=-z;
}

int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(i=1;i<=m;i++) {
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z),z=-z;
		insert(x,y,z);
	}
	t=0,w=1,d[1]=1,vis[1]=1;
	while (t<=w){
		int x=d[++t];
		for(i=ls[x];i;i=nx[i]) if (vis[e[i]]){
			if (dis[x]+ec[i]!=dis[e[i]])
				printf("No Answer\n"),exit(0);
		} else dis[e[i]]=dis[x]+ec[i],d[++w]=e[i],vis[e[i]]=1;
	}
	if (!vis[n]) printf("No Answer\n"),exit(0);
	for(i=2;i<=n;i++) if (vis[i]&&dis[i]>dis[1]) 
		printf("No Answer\n"),exit(0);
	for(i=1;i<n;i++) if (vis[i]&&dis[i]<dis[n])
		printf("No Answer\n"),exit(0);
	printf("%.6Lf",(long double)(dis[1]-dis[n])/s);
}

C++(clang++11) 解法, 执行用时: 161ms, 内存消耗: 7648K, 提交时间: 2021-04-06 22:00:48

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
vector<tuple<int,int>>G[N];
ll h[N];
int dfn[N],dfn_clock,n;
void dfs(int u){
	dfn[u]=++dfn_clock;
	for(auto& i:G[u]){
		int v,w;tie(v,w)=i;
		if(!dfn[v]){
			h[v]=h[u]+w;
			dfs(v);
		}
		else if(h[u]+w!=h[v]){
//			cout<<u<<':'<<h[u]<<'\n';
//			cout<<v<<':'<<h[v]<<'\n';
			puts("No Answer");
			exit(0);
		}
	}
}
int main(){
	int m,I;
	cin>>n>>m>>I;
	while(m--){
		int u,v,w;cin>>u>>v>>w;
		G[u].emplace_back(v,w);
		G[v].emplace_back(u,-w);
	}
	dfs(1);
	if(!dfn[n])goto error;	
	if(*max_element(h+1,h+1+n)!=h[n]||*min_element(h+1,h+1+n)!=h[1]){
		goto error;
	}
	printf("%.6f\n",h[n]/1.0/I);
	return 0;
	error:
		puts("No Answer");
}

上一题